c# - 使用 NodaTime 的明确 DateTime 表示——这可以用更少的仪式来完成吗?

标签 c# datetime nodatime

我有一个相当直接的想法,我想用野田时间来表达:

04/24/2015 下午 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") 确实是本地时间。 (如果您确实在其中找到了“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,然后将其解析到一个特定的区域。

关于c# - 使用 NodaTime 的明确 DateTime 表示——这可以用更少的仪式来完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908992/

相关文章:

python - 将 gmail 时间戳转换为 strptime

javascript - 将字符串解析为时间格式 JavaScript

c# - NSwag:如何在 C# -> Swagger -> C# 客户端中使用自定义值对象类型?

c# - 检查本地日期时间是否存在 NODA TIME

c# - 在每次调用时调用一个方法

c# - nHibernate - 类中的对象或 ObjectID

javascript - 尝试获取两个不同格式日期之间的日差(给出小数点)

c# - 用于电子邮件验证的正则表达式。

c# - 这个项目在 C 中的等效支架是什么(来自 C#)?

c# - NodaTime 根据国家代码获取国家时间