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

3

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

现在,当我将我的当前时间(EST)转换为CST(Central)或MST(Mountain)时,我没有获得偏移量。我错过了什么?还有其他方法吗?

代码:

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个回答

6
这是 DateTime 的预期行为。如果需要保留时区信息,请改用 DateTimeOffset
输出差异的原因在于 DateTime.NowcentralTime / mountainTime 是不同的类型:转换前的 DateTimeLocal,但转换后变成了 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表示协调世界时区。

第三个选项Unspecified表示DateTime的值本身不能被解释为绝对值,因为时间区域已经被剥离。你的代码知道它是哪个时区,因为你进行了转换,但是关于时区的信息是你的程序设计的一部分,而不是相应的DateTime对象的一部分。.NET特别添加了DateTimeOffset对象来解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接