使用 NodaTime 的明确 DateTime 表示——这可以用更少的仪式来完成吗?
Unambiguous DateTime representation with NodaTime -- can this be done with less ceremony?
我有一个相当直接的想法,我想用野田时间来表达:
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);
如果我真的想在发生更改时指定间隙语义,可能还有一些重载。
我想说你所拥有的实际上是目前最好的方法 - 你正在解析为正确的类型,因为你在文本中所拥有的(“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
然后将其解析到特定区域。
我有一个相当直接的想法,我想用野田时间来表达:
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);
如果我真的想在发生更改时指定间隙语义,可能还有一些重载。
我想说你所拥有的实际上是目前最好的方法 - 你正在解析为正确的类型,因为你在文本中所拥有的(“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
然后将其解析到特定区域。