通过UTC转换获取时区

时间:2019-07-14 19:49:07

标签: c# .net timezone utc

我在BST中有系统日期。我想将其转换为UTC。以下内容也是如此:

map show :: Show a => [a] -> [String]

我想要获得的区域以及UTC中的日期。请考虑夏令时。

示例:string utcDate= TimeZoneInfo.ConvertTimeToUtc(dt).ToString("dd/MM/yyyy HH:mm:ss");

2 个答案:

答案 0 :(得分:0)

我想你可以做这样的事情:

var dt = DateTime.Now;
string utcDate = dt.ToUniversalTime().ToString("dd/MM/yyyy HH:mm:ss") +
                 dt.ToString(" zzz");

输出 :(我在EET中)

14/07/2019 20:02:17 +02:00

但是请注意,这可能会使人们感到困惑。标准方法是时区遵循本地日期,而不是世界日期。

答案 1 :(得分:0)

几件事:

  • 您给出的示例字符串格式2019-07-08T23:59:00+01:00ISO 8601规范的一部分。确切地说,它是“ ISO 8601扩展格式”的“完整的日期和时间表示形式”。它也是RFC 3339定义的格式。

  • 在这种格式中,日期和时间部分表示本地时间,如时区偏移部分所示。换句话说,这些值不在UTC中,而是已经过调整。在您的示例中,2019-07-08T23:59:00是当地时间,而UTC+01:00在该时间生效。因此,相应的UTC时间将提前一个小时2019-07-08T22:59:00Z

  • 您似乎在要求使用UTC的日期,但偏移量包括夏令时。这是不可能的,因为UTC没有遵守夏令时。与UTC的偏移量始终为零。 You can read more about UTC here

  • UTC本身的偏移量用Z表示,但也可以用+00:00表示,可以将其视为“距UTC的零偏移量”。换句话说,如果您指的是UTC时间,请使用Z,并且如果您指的是与UTC一致的本地时间(例如冬天的伦敦格林尼治标准时间或冰岛等),请使用+00:00

  • 在您的问题中,您说您要使用UTC的系统时间和偏移量。我将通过“系统时间”假设您是指系统上时钟的当前时间。由DateTime.UtcNowDateTimeOffset.UtcNow提供。它们返回DateTimeDateTimeOffset结构-而不是字符串。由于您希望使用特定格式的字符串,因此您应该首先询问当前时间,然后使用ToString将其格式化为字符串:

    using System.Globalization;
    

    ...

    string a = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ssK", CultureInfo.InvariantCulture);
    // output example: "2019-07-08T22:59:00Z"
    
    string b = DateTimeOffset.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:sszzz", CultureInfo.InvariantCulture);
    // output example: "2019-07-08T22:59:00+00:00"
    
  • 如果您真正想要的是当地时间 ,则偏移量在冬季为+00:00,在夏季为+01:00(在英国) ),然后使用Now代替UtcNow。这样可以给出运行代码的计算机所在时区的本地时间。

    string c = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK", CultureInfo.InvariantCulture);
    // output example: "2019-07-08T23:59:00+01:00"
    
    string d = DateTimeOffset.Now.ToString("yyyy-MM-dd'T'HH:mm:sszzz", CultureInfo.InvariantCulture);
    // output example: "2019-07-08T23:59:00+01:00"
    
  • 如果您实际上想要在英国的时间而不管本地计算机所在的时区是什么,那么在创建字符串之前,您必须首先获取UTC时间,然后将其转换为英国时间。

    TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
    string e = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tzi).ToString("yyyy-MM-dd'T'HH:mm:ssK", CultureInfo.InvariantCulture);
    // output example: "2019-07-08T23:59:00"
    
    string f = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzi).ToString("yyyy-MM-dd'T'HH:mm:sszzz", CultureInfo.InvariantCulture);
    // output example: "2019-07-08T23:59:00+01:00"
    

    在示例e中,请注意,由于时区转换,DateTime不能存储任意偏移量,因此您将DateTimeKind.Unspecified分配给了{{1} }属性,导致字符串表示形式中没有偏移量。因此,在大多数情况下,您应该改用Kind(例如DateTimeOffset)。

    此外,请注意f的时区ID是在Windows平台上用于英国的正确ID。适当时,它可以在GMT和BST之间正确切换。如果在非Windows平台(Linux,OSX等)上运行.NET Core,则应改用"GMT Standard Time"。或者,如果您想编写与平台无关的代码,则可以使用我的TimeZoneConverter库,该库可以提供任何一种形式并可以在任何平台上运行。

  • 在您的代码示例中,您没有调用任何“现在”函数,而是提供了一个"Europe/London"变量。假设这是一个dt,则调用DateTime的结果将取决于该变量的TimeZoneInfo.ConvertTimeToUtc属性。如果为Kind,则不执行任何转换。如果是DateTimeKind.Utc DateTimeKind.Local,则该值将从计算机的本地时区转换为UTC。

  • 最后,请记住,与国际观众交谈时,时区缩写可能会含糊不清。我可以通过“ BST”推断出您的意思是英国夏令时,但这仅是因为您在问题中显示了DateTimeKind.Unspecified的偏移量。 “ BST”也可以代表“孟加拉国标准时间”(+01:00)或“ Bougainville Standard Time”(+06:00)。