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

时间:2017-01-15 14:31:33

标签: nodatime

我有一个数据库,其中所有日期都是UTC,并且驱动程序总是向DateTimeDateTimeKind.Unspecified对象发送Instant.FromDateTimeUtc(utcDate).InZone(localZone);个对象。我想假设它们是UTC并转换为当地时间。

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

$url_parts一直在抱怨DateTimeKind应该是Utc。

2 个答案:

答案 0 :(得分:5)

如果您肯定使用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完全从图片中删除。

事实上,如果您不需要在其他地方使用Noda Time,那么只需DateTime.ToLocalTime()即可。

var localDateTime = utcDateTime.ToLocalTime();

...如果您在其上调用ToLocalTime(),BCL将假定未指定的日期/时间 UTC。当然,我建议在任何地方使用Noda Time:)

答案 1 :(得分:0)

Instant now = SystemClock.Instance.GetCurrentInstant();
                    DateTimeZone TimeZone = DateTimeZoneProviders.Tzdb.GetSystemDefault();
                    var zoned = LocalDateTime.FromDateTime(msg.MessageSentUtc)
                     .InZoneStrictly(DateTimeZone.Utc)
                     .WithZone(TimeZone);

简体...