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

CSh*_*per 3 c# datetime

我试图将日期转换为UTC格式,我可以获得正确的偏移量.我正在使用ToString("O")简单的DateTime.Now工作.

现在,当我将当前时间(EST)转换为CST(中央)或MST(山峰)时,我没有得到抵消.我在这里错过了什么?还有其他办法吗?

码:

var currentTimeToUtc = DateTime.Now.ToString("O");
// Output = "2018-12-27T12:31:21.9946661-05:00" --This is perfect.

var centralTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "Central Standard Time");
var centralTimeToUtc = centralTime.ToString("O");
// Output = "2018-12-27T11:31:19.8046052"
// Expected Output = "2018-12-27T11:31:19.8046052-06:00"

var mountainTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "Mountain Standard Time");
var mountainTimeToUtc = mountainTime.ToString("O");
// Output = "2018-12-27T10:31:25.2438418"
// Expected Output = "2018-12-27T10:31:25.2438418-07:00"
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

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

输出差异的原因是DateTime.NowcentralTime/ mountainTime是不同类型:DateTime在转换之前Local,但在转换之后它变为Unspecified.

运行以下程序以确认:

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);
Run Code Online (Sandbox Code Playgroud)

行为无法更改,因为DateTime不存储偏移量; 它依赖于两个众所周知的时区解释偏移量 - Local表示您的本地时区,UTC表示UTC时区.

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