将DateTime与DateTimeKind.Unspecified从utc转换为local

Nat*_*tan 3 nodatime

我有一个数据库,所有日期都是UTC,驱动程序总是发送给我的DateTime对象DateTimeKind.Unspecified.我想假设它们是UTC并转换为当地时间.

使用NodaTime实现这一目标的最简单方法是什么?

Instant.FromDateTimeUtc(utcDate).InZone(localZone); 继续抱怨DateTimeKind应该是Utc.

Jon*_*eet 6

如果您肯定使用Noda Time并想要一个ZonedDateTime,您可以"告诉"Noda Time你真的有一个UTC值,然后转换它:

var zoned = LocalDateTime.FromDateTime(utcDate)
                         .InZoneStrictly(DateTimeZone.Utc)
                         .WithZone(localZone);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用DateTime.SpecifyKind以下开头:

var utcDateTime = DateTime.SpecifyKind(unspecifiedDateTime, DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)

...然后使用您现有的代码,或者如果您愿意,可以将Noda Time完全取出.

事实上,DateTime.ToLocalTime()如果你在其他地方不需要Noda Time ,那就没关系了:

var localDateTime = utcDateTime.ToLocalTime();
Run Code Online (Sandbox Code Playgroud)

... 如果你打电话,BCL将假设未指定的日期/时间 UTC ToLocalTime().当然,我建议尽量使用Noda Time :)