【问题标题】:Why are two hours added to my time为什么我的时间增加了两个小时
【发布时间】:2017-06-13 18:27:10
【问题描述】:

我正在为时间解析而苦苦挣扎。我的输入是以“Z”结尾的时间字符串。我希望那是UTC。当我解析该字符串时,结果中会增加两个小时。我不知道为什么。使用特定的文化没有任何区别。

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
string inTime = "2015-04-25T23:39:15Z";
DateTime outTime = DateTime.Parse(inTime, ci);
string outTime_string = outTime.ToString("yyyy-MM-ddTHH:mm:ssZ", ci);
// outTme and outTime_string are both 2015-04-26T01:39:15Z

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    默认情况下,DateTime.Parse 转换为 Local 的“种类”。 (打印出outTime.Kind 以验证这一点。)因此它理解源是通用的——但它正在将其调整为系统本地时间。请注意,culture 与时区无关 - 仅与格式和日历系统有关。

    您可以通过指定 DateTimeStyles 值来防止这种情况发生:

    DateTime outTime = DateTime.Parse(inTime, ci, DateTimeStyles.AdjustToUniversal);
    

    此时,outTime.Kind 将变为 Utc,并且值将如预期的那样为下午 23:39。

    快速插入:整个DateTime.Kind 位是一团糟。拥有一个代表三种不同值的类型是很糟糕的。您可能想查看我的 Noda Time 项目,了解在 .NET 中处理日期/时间的另一种方法。

    【讨论】:

      【解决方案2】:

      它返回当地时间。 This will fix that:

      var x = DateTime.Parse(inTime, ci, 
                  System.Globalization.DateTimeStyles.AdjustToUniversal);
      

      See this answer as well:

      我建议您在格式字符串中解析为 DateTimeOffset 而不是 DateTime,as recommended in MSDN when using a time zone offset specifier

      时区是一个真正难以处理的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 2020-01-29
        • 1970-01-01
        相关资源
        最近更新 更多