Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何将DateTimeOffset转换为其他时区_.net_Date_Timezone - Fatal编程技术网

.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
    种类的
    DateTime
    。使用将被视为UTC的
    ConvertTimeFromUtc
    ,但如果您不小心使用了
    ConvertTime
    ,则未指定的将被视为本地时间。所以在那里要小心

  • 还要注意,从
    DateTime
    DateTimeOffset
    ,存在一个单向隐式转换,其中考虑了
    .Kind
    。如果使用
    DateTime
    进行转换,但随后将结果分配给
    DateTimeOffset
    ,则可能会出现此问题。你不在这里,但这是另一个需要注意的常见错误


您可以查看方法谢谢。。。总结是。。。避免
DateTime
!事实上-不是。这是一个常见的反应,但是对于
DateTime
有许多有效的用例,但是
DateTimeOffset
不能很好地使用它们。特别是,
DateTimeOffset
总是表示一个特定的时间点,但有时确实需要“未指定”。下面是一个很好的概述: