.net 如何将DateTimeOffset转换为其他时区
假设.net 如何将DateTimeOffset转换为其他时区,.net,date,timezone,.net,Date,Timezone,假设source是一个任意的DateTimeOffset,我想将一个变量dest(也是DateTimeOffset类型)分配给纽约的同一时间点,并具有适当的偏移量。以下代码似乎可以做到这一点: var utcSource = source.ToUniversalTime(); var destZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var destDateTime = TimeZ
source
是一个任意的DateTimeOffset
,我想将一个变量dest
(也是DateTimeOffset
类型)分配给纽约的同一时间点,并具有适当的偏移量。以下代码似乎可以做到这一点:
var utcSource = source.ToUniversalTime();
var destZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var destDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcSource.DateTime, destZone);
var destZoneOffset = destZone.GetUtcOffset(destDateTime);
var dest = new DateTimeOffset(destDateTime, destZoneOffset);
我的问题:有没有更简单的方法?对于一个非常常见的需求,这似乎有很多代码,特别是因为对于大多数用例,
DateTimeOffset
比DateTime
更受欢迎。(我意识到,如果我只使用DateTime
,代码会更简单)正如Pavel在问题的评论中指出的那样,您可以在一行中完成此操作,如下所示:
DateTimeOffset dest = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(source, "Eastern Standard Time");
或者,如果您已经为目标设置了TimeZoneInfo
对象,请执行以下操作:
DateTimeOffset dest = TimeZoneInfo.ConvertTime(source, destZone);
当然,如果您愿意,可以使用var
有两点:
- 请注意,
确实是一个source
。如果它实际上是一个DateTimeOffset
,那么源值的DateTime
属性将以不明显的方式影响操作。每个转换方法的文档都包含一个描述此行为的表,但每个方法的表并不相同.Kind
的DateTimeOffset
属性返回带有.DateTime
种类的DateTimeKind.Unspecified
。使用将被视为UTC的DateTime
,但如果您不小心使用了ConvertTimeFromUtc
,则未指定的将被视为本地时间。所以在那里要小心ConvertTime
- 还要注意,从
到DateTime
,存在一个单向隐式转换,其中考虑了DateTimeOffset
。如果使用.Kind
进行转换,但随后将结果分配给DateTime
,则可能会出现此问题。你不在这里,但这是另一个需要注意的常见错误DateTimeOffset
DateTime
!事实上-不是。这是一个常见的反应,但是对于DateTime
有许多有效的用例,但是DateTimeOffset
不能很好地使用它们。特别是,DateTimeOffset
总是表示一个特定的时间点,但有时确实需要“未指定”。下面是一个很好的概述: