使用NodaTime进行明确的DateTime表示 - 这可以通过较少的仪式完成吗?

时间:2015-04-28 01:58:23

标签: c# datetime nodatime

我有一个相当直截了当的想法,我想用Noda Time代表:

04/24/2015 4:00pm America/New_York

为了创建一个明确的表示,我已经完成了以下工作:

var _americaNewYork = DateTimeZoneProviders.Tzdb["America/New_York"];
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("M/d/yyyy h:mmtt");
var localTime = pattern.Parse(formattedDatetime).Value;
var zonedDateTime = localTime.InZoneLeniently(_easternTime);

有没有更简洁的方法来做我上面做的事情?我觉得我应该用一两行代替它:

var unambiguous = new ZonedDateTime(string textToParse, DateTimePattern pattern, string timezone);

如果我真的想在更改发生时指定间隙语义,那么可能会有一些重载。

1 个答案:

答案 0 :(得分:3)

我说你所拥有的实际上是目前最好的方法 - 你正在解析为正确的类型,因为你在文本中得到了什么( " 04/24/2015 4:00 pm")真的是当地时间。 (如果您实际上已经获得了#34; America / New_York"位,那么您绝对应该使用ZonedDateTimePattern。)

但是你可以使用ZonedDateTimePattern,并使用适当的解析器和模板值:

var tzdb = DateTimeZoneProviders.Tzdb;
var pattern = ZonedDateTimePattern.Create(
    "M/d/yyyy h:mmtt",
    CultureInfo.InvariantCulture,
    Resolvers.LenientResolver,
    tzdb,
    NodaConstants.UnixEpoch.InZone(tzdb["America/New_York"]));
string text = "04/24/2015 4:00pm";

var zoned = pattern.Parse(text).Value;
Console.WriteLine(zoned);

显然,开头的代码更多,但您可以多次重复使用该模式。

正如我所说,我个人坚持使用你已经得到的内容,因为它确切地说明了你要做的事情:解析LocalDateTime然后将其解析为特定内容区。