入门野田时间(Getting Started with Noda Time)

2019-08-17 21:41发布

我期待野田使用时间,一个相当简单的应用程序,但我在努力寻找任何文件处理一个非常基本的使用案例:

我有登录的用户,并且将被存储其优选的时区中的设置。 任何日期/时间的是来自客户端来,在已知的文本格式(例如“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:

我知道有人会问“你尝试过什么”,对我有全都是各种失败的转换。 快乐指出到“入门野田时间”页面!

Answer 1:

我正打算在这些时间转换为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();


文章来源: Getting Started with Noda Time