我正在努力解决时间问题。我的输入是以" 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
答案 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);
我建议您解析为DateTimeOffset而不是格式字符串中的DateTime as recommended in MSDN when using a time zone offset specifier:
时区是一个真正的痛苦需要处理。