C# 用NodaTime表示明确的日期时间——这可以用较少的仪式来完成吗?

C# 用NodaTime表示明确的日期时间——这可以用较少的仪式来完成吗?,c#,datetime,nodatime,C#,Datetime,Nodatime,我有一个非常简单的概念,我想用野田佳彦的时间来表达: 2015年4月24日美国/纽约下午4:00 为了创建明确的表示,我做了以下工作: var _americaNewYork = DateTimeZoneProviders.Tzdb["America/New_York"]; var pattern = LocalDateTimePattern.CreateWithInvariantCulture("M/d/yyyy h:mmtt"); var localTime = pattern.Parse(

我有一个非常简单的概念,我想用野田佳彦的时间来表达:

2015年4月24日美国/纽约下午4:00

为了创建明确的表示,我做了以下工作:

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);

如果我真的想在发生更改时指定间隙语义,可能还需要一些重载。

我要说的是,您现在得到的实际上是最好的方法-您正在解析到正确的类型,因为您在文本中得到的(“04/24/2015 4:00pm”)实际上是本地时间。(如果你真的有“美国/纽约”这一点,你肯定应该使用
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
,然后将其解析到一个特定区域。

欢迎反馈,但最好是在野田佳彦时间讨论论坛上。我看不出你的代码有什么问题。这正是野田佳彦当前设计理念的适当数量的仪式。:)啊,我还没有看到ZoneDateTime模式。