我有一个数据库,所有日期都是UTC,驱动程序总是发送给我的DateTime
对象DateTimeKind.Unspecified
.我想假设它们是UTC并转换为当地时间.
使用NodaTime实现这一目标的最简单方法是什么?
Instant.FromDateTimeUtc(utcDate).InZone(localZone);
继续抱怨DateTimeKind应该是Utc.
如果您肯定使用Noda Time并想要一个ZonedDateTime
,您可以"告诉"Noda Time你真的有一个UTC值,然后转换它:
var zoned = LocalDateTime.FromDateTime(utcDate) .InZoneStrictly(DateTimeZone.Utc) .WithZone(localZone);
或者您可以使用DateTime.SpecifyKind
以下开头:
var utcDateTime = DateTime.SpecifyKind(unspecifiedDateTime, DateTimeKind.Utc);
...然后使用您现有的代码,或者如果您愿意,可以将Noda Time完全取出.
事实上,DateTime.ToLocalTime()
如果你在其他地方不需要Noda Time ,那就没关系了:
var localDateTime = utcDateTime.ToLocalTime();
... 如果你打电话,BCL将假设未指定的日期/时间是 UTC ToLocalTime()
.当然,我建议尽量使用Noda Time :)