我们正在为web服务客户端开发一个c#应用程序。这将在Windows XP PC上运行。
web服务返回的字段之一是DateTime字段。服务器返回一个GMT格式的字段,即结尾有一个“Z”。
然而,我们发现。net似乎做了某种隐式转换,而且时间总是12小时。
下面的代码示例在一定程度上解决了这个问题,因为12小时的差异已经消失,但它不考虑新西兰的夏令时。
CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);
根据这个约会网站:
UTC / GMT抵消
标准时区:UTC/GMT +12小时
夏令时:+1小时
当前时区偏移:UTC/GMT +13小时
我们如何调整额外的一小时?这可以通过编程来完成吗?或者这是PC上的某种设置吗?
对于诸如2012-09-19 01:27:30.000,DateTime. 000等字符串。解析无法判断日期和时间来自哪个时区。
DateTime有一个Kind属性,它可以有三个时区选项之一:
未指明的
当地的
Utc
如果您希望表示UTC或本地时区以外的日期/时间,那么您应该使用DateTimeOffset。
对于你问题中的代码
DateTime convertedDate = DateTime.Parse(dateStr);
var kind = convertedDate.Kind; // will equal DateTimeKind.Unspecified
你说你知道是什么,那就说出来。
DateTime convertedDate = DateTime.SpecifyKind(
DateTime.Parse(dateStr),
DateTimeKind.Utc);
var kind = convertedDate.Kind; // will equal DateTimeKind.Utc
现在,一旦系统知道它是UTC时间,你可以调用ToLocalTime:
DateTime dt = convertedDate.ToLocalTime();
这将给你你需要的结果。
我知道这是一个老问题,但我遇到过类似的情况,我想分享我的发现给未来的搜索者,可能包括我自己:)。
DateTime.Parse()可能很棘手——参见这里的例子。
如果DateTime来自Web服务或其他具有已知格式的源,则可能需要考虑类似于
DateTime.ParseExact(dateString,
"MM/dd/yyyy HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)
或者更好的是,
DateTime.TryParseExact(...)
AssumeUniversal标志告诉解析器日期/时间已经是UTC;AssumeUniversal和adjusttuniversal的组合告诉它不要将结果转换为“本地”时间,默认情况下它会尝试这样做。(无论如何,我个人尝试在业务/应用程序/服务层专门处理UTC。但跳过转换到本地时间也会加快速度——在我的测试中,速度加快了50%或更多,见下文。)
这是我们之前所做的:
DateTime.Parse(dateString, new CultureInfo("en-US"))
我们对这款应用进行了分析,发现DateTime。解析占CPU使用的很大比例。(顺便提一下,CultureInfo构造函数并不是CPU使用的重要贡献者。)
所以我设置了一个控制台应用程序,以各种方式解析日期/时间字符串10000次。底线:
Parse() 10秒
ParseExact()(转换为本地)20-45毫秒
ParseExact()(不转换为本地)10-15毫秒
... 是的,Parse()的结果是以秒为单位的,而其他的是以毫秒为单位的。
不要忘记,如果你已经有一个DateTime对象,并且不确定它是UTC还是Local,直接使用对象上的方法是很容易的:
DateTime convertedDate = DateTime.Parse(date);
DateTime localDate = convertedDate.ToLocalTime();
我们如何调整额外的一小时?
除非指定。net将使用本地pc设置。我会读到:http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx
从外观上看,代码可能是这样的:
DaylightTime daylight = TimeZone.CurrentTimeZone.GetDaylightChanges( year );
如上所述,仔细检查您的服务器设置的时区。网上有关于如何安全地影响IIS中的更改的文章。