【问题标题】:Convert time in string to UTC time? [duplicate]将字符串中的时间转换为UTC时间? [复制]
【发布时间】:2012-12-04 09:10:38
【问题描述】:

可能重复:
C# Datetimes: Conversion for different time zones

我有一个类似“2012.12.04T08:35:00”的字符串,它表示“西欧标准时间”时区中的时间。

现在,我想将其正确转换为 UTC 时间的 c# DateTime 对象。

这样做的正确方法是什么?

【问题讨论】:

  • C# Datetimes: Conversion for different time zones 告诉您如何将时间转换为(或至少从;您可以从中推断)UTC,当您知道它代表什么时区时。
  • 我知道如何在拥有正确时区的正确 DateTime 对象后立即在时区之间转换日期时间。问题是首先到达那里。
  • @Olav 编辑了我的答案以解析到特定的时区偏移量。
  • DateTime 没有时区的概念。他们可以指定一个DateTimeKind,它允许您说明日期是本地日期还是UTC。

标签: c# .net


【解决方案1】:

特定时区之间转换时使用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 对给定值的时区做出no 假设。 IT 将其存储为 DateTimeKindUnspecified
  • 此处使用的TimeZoneInfo.ConvertTimeToUtc 预期一个Unspecified 日期时间,读取它就像它在明确指定时区,并将其转换为UTC。

【讨论】:

  • +1。这是做到这一点的方法。我希望 TimeZoneInfo 有一种方法可以按标准时区abbreviations 查找。
  • 您错误地假设代码运行在“W”中的计算机上。欧洲标准时间”时区。情况并非如此,因为代码在 Windows Azure 数据中心中运行。
  • @Olav 我不做这样的假设。如果我一直使用DateTime.ToUniersalTime 是的,但TimeZoneInfo there 可以在非本地时区之间转换时间。 (这适用于我的机器,我在 UTC 区域,而不是在 WEST。)
  • @ErenErsönmez 扩展方法!
  • @James 不完全是如何它应该被转换,但是否它应该被转换;如果是Local但指定的时区不是本地时区,或者Utc但指定的时区不是UTC,它会抛出而不是决定如何正确转换。
【解决方案2】:

您可以使用 DateTimeOffset.TryParse 方法。

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

在此处查看帖子

Converting string to DateTime with offset

【讨论】:

    【解决方案3】:

    从 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

    编辑(来自 cmets 的更正):

    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 ToUniversal 将使用本地时区信息(即机器本身的时区)转换日期时间。
    • 建议的答案并不能解决问题。我的问题是如何将字符串解析为 DateTime 对象,并且生成的对象位于“W. Europe Standard Time”时区。
    • 上面的代码实际上运行良好!
    【解决方案4】:

    您可以使用 Convert.ToDateTime()。它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2016-10-03
      • 2015-10-24
      • 2016-12-12
      相关资源
      最近更新 更多