我会用我的野田时间 http://nodatime.org/个人项目。 (诚然,我作为作者有偏见,但它会更干净......)但是如果你不能这样做......
要么使用DateTime.ParseExact
指定您期望的确切格式,并包括DateTimeStyles.AssumeUniversal
and DateTimeStyles.AdjustToUniversal
在解析代码中:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var date = DateTime.ParseExact("2012-09-30T23:00:00.0000000Z",
"yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal);
Console.WriteLine(date);
Console.WriteLine(date.Kind);
}
}
(这就是为什么它会默认调整为本地而不AdjustToUniversal
超出了我的范围,但没关系......)
编辑:只是为了扩展我对 mattytommo 的建议的反对意见,我的目的是证明它会丢失信息。到目前为止我已经失败了——但是以一种非常奇特的方式。看看这个 - 在欧洲/伦敦时区运行,时钟回到 2012 年 10 月 28 日,当地时间凌晨 2 点(世界标准时间凌晨 1 点):
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
Console.WriteLine(local1 == local2); // True
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1 == utc2); // False. Hmm.
看起来好像存储了“有或没有 DST”标志某处,但如果我能弄清楚在哪里,我会感到震惊。的文档TimeZoneInfo.ConvertTimeToUtc http://msdn.microsoft.com/en-us/library/bb495915.aspx state
If dateTime对应一个模糊时间,该方法假设它是源时区的标准时间。
那不appear转换时就是这种情况local2
...
编辑:好吧,它变得更奇怪 - 这取决于您使用的框架版本。考虑这个程序:
using System;
using System.Globalization;
class Test
{
static void Main()
{
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1);
Console.WriteLine(utc2);
DateTime utc3 = local1.ToUniversalTime();
DateTime utc4 = local2.ToUniversalTime();
Console.WriteLine(utc3);
Console.WriteLine(utc4);
}
}
所以这需要两个不同的UTC 值,解析它们DateTime.Parse
,然后以两种不同的方式将它们转换回 UTC。
.NET 3.5 下的结果:
28/10/2012 01:30:00 // Look - we've lost information
28/10/2012 01:30:00
28/10/2012 00:30:00 // But ToUniversalTime() seems okay...
28/10/2012 01:30:00
.NET 4.5 beta 下的结果:
28/10/2012 00:30:00 // It's okay!
28/10/2012 01:30:00
28/10/2012 00:30:00
28/10/2012 01:30:00