我期待野田使用时间,一个相当简单的应用程序,但我在努力寻找任何文件处理一个非常基本的使用案例:
我有登录的用户,并且将被存储其优选的时区中的设置。 任何日期/时间的是来自客户端来,在已知的文本格式(例如“DD / MM / YYYY HH:MM”),与已知的时区ID(如“欧洲/伦敦”)。 我正打算在这些时间转换为UTC /野田即时以防止需要存储与数据库中的每个日期的时区信息。
首先,这听起来像一个明智的做法? 我可以自由地改变几乎任何东西,所以会很乐意要在更好/更明智的做法设置。 该数据库是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 /野田即时以防止需要存储所有与数据库中的每个日期的时区信息。
那很好,如果你不需要知道原来的时区以后。 (例如,如果用户更改时区,但仍希望的东西在原来的时区经常性)。
无论如何,我会分离出这三个步骤:
- 解析成
LocalDateTime
- 该转换成
ZonedDateTime
- 转换到这一个
Instant
就像是:
// 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();