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

时间:2018-12-27 17:54:51

标签: 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"

1 个答案:

答案 0 :(得分: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);

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

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