【问题标题】:How to get the offset when converting time to specific timezone and then UTC? C#将时间转换为特定时区然后转换为 UTC 时如何获取偏移量? C#
【发布时间】:2018-12-27 17:54:50
【问题描述】:

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

现在,当我将当前时间 (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"

【问题讨论】:

    标签: c# datetime


    【解决方案1】:

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

    输出不同的原因是DateTime.NowcentralTime/mountainTime是不同的种类:转换前DateTimeLocal,转换后是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 对象来解决这个问题。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 2012-08-02
      • 2020-03-21
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多