将字符串中的时间转换为UTC时间?

4
我有一个字符串"2012.12.04T08:35:00",它表示"W. Europe Standard Time"时区的时间。现在,我想将其正确转换为UTC时间的c# DateTime对象。请问如何正确地完成这个操作?
可能重复:
C# Datetimes: Conversion for different time zones

C# Datetimes: Conversion for different time zones告诉您如何在知道时间所代表的时区时将时间转换为(或至少从中转换为)UTC。 - Rawling
我知道如何在拥有正确时区的DateTime对象的情况下在不同时区之间转换日期时间。问题是首先如何获得这个对象。 - Olav
@Olav编辑了我的答案,以解析到特定的时区偏移量。 - Eren Ersönmez
DateTime 没有时区的概念。它们可以指定 DateTimeKind,以便您可以说明日期是本地时间还是 UTC 时间。 - Phil Gan
4个回答

5

在转换时间区时,使用TimeZoneInfo来处理 具体 的时区:

TimeZoneInfo westInfo =
    TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");

DateTime westTime = DateTime.Parse("2012.12.04T08:35:00");
DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(westTime, westInfo);

为了解决您的困惑:
  • 此处使用的DateTime.Parse不对给定值的时区做任何假设,它将其存储为具有 UnspecifiedDateTimeKind
  • 此处使用的TimeZoneInfo.ConvertTimeToUtc 预期一个Unspecified日期时间,并将其视为在明确指定的时区中,然后将其转换为UTC。

+1. 这就是做法。我希望 TimeZoneInfo 有一种方法可以通过标准时区缩写来查找。 - Eren Ersönmez
你犯了一个错误的假设,认为代码运行在处于“W.欧洲标准时间”时区的计算机上。实际情况并非如此,因为代码是在Windows Azure数据中心运行的。 - Olav
@Rawling 在这里使用的 "TimeZoneInfo.ConvertTimeToUtc " 函数期望一个未指定时区的日期时间。虽然可能只是我太过挑剔,但我不同意这种说法!文档说明了如果 DateTime 已经是 UTC 时间,则不进行转换,否则将假定相对于转换中使用的时区的本地时间。 - James
@Olav 我得到了一个带有Utc时区的DateTime,年份为2012年,月份为12月,日期为4日,小时为7点,分钟为35分,秒数为0秒。 - Rawling
@Rawling,你说得完全正确,代码运行良好!我自己还有一个错误,一直在搞砸。谢谢! - Olav
显示剩余5条评论

1

0
从MSDN上阅读,您应该能够像这样将字符串解析为DateTime对象:
DateTime convertedDate = DateTime.Parse("2012.12.04T08:35:00");

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx

你可能需要将 . 更改为 -

然后您应该能够使用此方法获取UTC时间。

convertedDate.ToUniversalTime();

http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx

编辑(来自评论的更正):

TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");

DateTime convertedTime = TimeZoneInfo.ConvertTimeToUtc(convertedDate, tst);

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx


1
-1 ToUniversal 将使用本地时区信息,即机器本身的时区,转换日期时间。 - James
提出的答案并没有解决问题。我的问题是如何将字符串解析为DateTime对象,并且确保生成的对象处于“W. Europe Standard Time”时区。 - Olav
以上代码实际上运行良好! - Olav

-2
你可以使用 Convert.ToDateTime()。它应该可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接