为什么我的时间增加了两个小时

时间:2017-06-13 18:27:10

标签: c# .net

我正在努力解决时间问题。我的输入是以" 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

2 个答案:

答案 0 :(得分:7)

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

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

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

此时,outTime.Kind将为Utc,价值将是预期的23:39 pm。

快速插件:整个DateTime.Kind位乱七八糟。拥有代表三种不同价值的类型真是太可怕了。您可能希望查看我的Noda Time项目,了解.NET中日期/时间处理的替代方法。

答案 1 :(得分:4)

返回当地时间。 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

时区是一个真正的痛苦需要处理。