开始使用野田时间
本文关键字:时间 田时间 开始 | 更新日期: 2023-09-27 18:05:11
我正在寻找一个相当简单的应用程序使用Noda时间,但是我很难找到任何文档来处理一个非常基本的用例:
我有一个登录的用户,并将在设置中存储他们的首选时区。来自客户端的任何日期/时间都以已知的文本格式(例如:"dd/MM/yyyy HH: MM "),并带有已知的时区id(例如:"欧洲/伦敦")。我计划将这些时间转换为UTC/Noda瞬间,以防止需要在数据库中存储每个日期的时区信息。
首先,这听起来像一个明智的方法吗?我可以自由地改变几乎任何事情,所以我很高兴能走上一条更好/更明智的道路。数据库为MongoDb,使用c#驱动程序。
我所尝试的是沿着这些路线,但努力克服第一步!
var userSubmittedDateTimeString = "2013/05/09 10:45";
var userFormat = "yyyy/MM/dd HH:mm";
var userTimeZone = "Europe/London";
//noda code here to convert to UTC
//Then back again:
我知道有人会问"你试过什么",我所拥有的只是各种失败的转换。很高兴被指向一个"开始野田时间"页面!
我计划将这些时间转换为UTC/Noda瞬间,以防止需要在数据库中存储每个日期的所有时区信息。
这很好如果您稍后不需要知道原始时区。(例如,如果用户更改了时区,但仍然希望在原时区中重复出现一些内容)。
无论如何,我将把它分成三步:
- 解析为
- 转换成
ZonedDateTime
- 转换成
Instant
LocalDateTime
类似:
// TODO: Are you sure it *will* be in the invariant culture? No funky date
// separators?
// Note that if all users have the same pattern, you can make this a private
// static readonly field somewhere
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy/MM/dd HH:mm");
var parseResult = pattern.Parse(userSubmittedDateTimeString);
if (!parseResult.Success)
{
// throw an exception or whatever you want to do
}
var localDateTime = parseResult.Value;
var timeZone = DateTimeZoneProviders.Tzdb[userTimeZone];
// TODO: Consider how you want to handle ambiguous or "skipped" local date/time
// values. For example, you might want InZoneStrictly, or provide your own custom
// handler to InZone.
var zonedDateTime = localDateTime.InZoneLeniently(timeZone);
var instant = zonedDateTime.ToInstant();