如何在将时间转换为特定时区和UTC时获得偏移量?C#

如何在将时间转换为特定时区和UTC时获得偏移量?C#,c#,datetime,C#,Datetime,我正在尝试将日期转换为UTC格式,以便获得正确的偏移量。我在简单的DateTime中使用ToString(“O”)。现在它可以工作了 现在,当我将当前时间(EST)转换为CST(中央)或MST(山区)时,我不会得到偏移量。我错过了什么?还有别的办法吗 代码: 这是DateTime的预期行为。如果需要保留时区信息,请改用DateTimeOffset 输出差异的原因是DateTime。现在和centralTime/mountainTime是不同的类型:DateTime在转换前是本地的,但转换后变成未

我正在尝试将日期转换为UTC格式,以便获得正确的偏移量。我在简单的
DateTime中使用
ToString(“O”)
。现在它可以工作了

现在,当我将当前时间(EST)转换为CST(中央)或MST(山区)时,我不会得到偏移量。我错过了什么?还有别的办法吗

代码:


这是
DateTime
的预期行为。如果需要保留时区信息,请改用
DateTimeOffset

输出差异的原因是
DateTime。现在
centralTime
/
mountainTime
是不同的类型:
DateTime
在转换前是
本地的
,但转换后变成
未指定的

运行以下程序以确认这一点:

var now = DateTime.Now;
Console.WriteLine(now.Kind);
var centralTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Central Standard Time");
Console.WriteLine(centralTime.Kind);
var mountainTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Mountain Standard Time");
Console.WriteLine(mountainTime.Kind);
无法更改该行为,因为
DateTime
不存储偏移量;它依靠两个众所周知的偏移量来解释时区-
Local
表示您的本地时区,
UTC
表示UTC时区

第三个选项,
Unspecified
,意味着
DateTime
的值本身不能解释为绝对值,因为时区已从中剥离。您的代码知道它是什么时区,因为您进行了转换,但是关于时区的信息是程序设计的一部分,而不是相应的
DateTime
对象的一部分。NET专门添加了
DateTimeOffset
对象来解决此问题

var now = DateTime.Now;
Console.WriteLine(now.Kind);
var centralTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Central Standard Time");
Console.WriteLine(centralTime.Kind);
var mountainTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Mountain Standard Time");
Console.WriteLine(mountainTime.Kind);