Windows 如何将UTC日期时间转换为指定时区?

Windows 如何将UTC日期时间转换为指定时区?,windows,datetime,delphi,winapi,timezone,Windows,Datetime,Delphi,Winapi,Timezone,看起来很简单,但我没有找到将UTC日期时间转换为指定时区的方法。我找到了如何将UTC日期时间转换为本地日期时间,但现在我想转换为特定时区(例如莫斯科时间) 例如,在c#中,我们可以做到: // user-specified time zone TimeZoneInfo southPole = TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time"); // an UTC DateTime Dat

看起来很简单,但我没有找到将UTC日期时间转换为指定时区的方法。我找到了如何将UTC日期时间转换为本地日期时间,但现在我想转换为特定时区(例如莫斯科时间)

例如,在c#中,我们可以做到:

// user-specified time zone
TimeZoneInfo southPole =
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time");

// an UTC DateTime
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc);

// DateTime with offset
DateTimeOffset dateAndOffset =
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime));

Console.WriteLine(dateAndOffset);
但是如何在Delphi中实现呢?

有几件事:

  • “南极洲/南极标准时间”
    不是实时时区标识符。我想你是开玩笑说的,但它不清楚你是想使用Windows时区标识符(如
    “东部标准时间”
    ),还是IANA时区标识符(如
    “美国/纽约”

  • 假设您想使用Windows标识符,您确实可以使用Win32 API中的函数。然而,问题中的评论暗示了错误的API。你应该改为使用

    • 它使用自Windows Vista以来一直可用的结构。要从命名的Windows时区标识符中获取其中一个时区,请使用函数在系统时区中循环,直到在
      TimeZoneKeyName
      字段中找到匹配的时区
    • “动态”结构的使用非常重要,应始终优先于旧结构。它们允许访问存储在Windows注册表中的时区和夏令时规则的更改。如果没有它们,您只能访问当前规则,这可能不是转换日期的正确规则
  • 如果您希望使用IANA时区标识符,请使用,如图所示

    • 如果您不确定使用哪种方法,我强烈推荐这种方法。IANA标识符可与其他操作系统、编程语言、框架和库相互操作。(Windows标识符,较少如此。)
    • 有几件事:

      • “南极洲/南极标准时间”
        不是实时时区标识符。我想你是开玩笑说的,但它不清楚你是想使用Windows时区标识符(如
        “东部标准时间”
        ),还是IANA时区标识符(如
        “美国/纽约”

      • 假设您想使用Windows标识符,您确实可以使用Win32 API中的函数。然而,问题中的评论暗示了错误的API。你应该改为使用

        • 它使用自Windows Vista以来一直可用的结构。要从命名的Windows时区标识符中获取其中一个时区,请使用函数在系统时区中循环,直到在
          TimeZoneKeyName
          字段中找到匹配的时区
        • “动态”结构的使用非常重要,应始终优先于旧结构。它们允许访问存储在Windows注册表中的时区和夏令时规则的更改。如果没有它们,您只能访问当前规则,这可能不是转换日期的正确规则
      • 如果您希望使用IANA时区标识符,请使用,如图所示

        • 如果您不确定使用哪种方法,我强烈推荐这种方法。IANA标识符可与其他操作系统、编程语言、框架和库相互操作。(Windows标识符,较少如此。)

      尽管有人声称此结构是以UTC表示时间,但它似乎无法做到这一点。秒的有效范围为“0到59”。要表示UTC,此值的范围必须为0到60。@RbMm-实际上,应该使用
      systemtimetotzspecificcoltimeex
      。请参见下面我的答案中的推理。@IInspectable-虽然UTC在其正式规范中有闰秒,但绝大多数日期/时间API(任何语言/平台)都不代表它。这并不意味着他们不使用UTC。不管怎样,它都与这里所问的问题无关。@mat:它与所问的问题有关。GMT和UTC之间存在差异(即闰秒)。我不确定你对“绝大多数”的定义。CC++已经确认了需要执行不同的时钟(包括UTC),它确实将正式的规范带入了。尽管声称,这种结构是在UTC中表示时间的,但它似乎不能。秒的有效范围为“0到59”。要表示UTC,此值的范围必须为0到60。@RbMm-实际上,应该使用
      systemtimetotzspecificcoltimeex
      。请参见下面我的答案中的推理。@IInspectable-虽然UTC在其正式规范中有闰秒,但绝大多数日期/时间API(任何语言/平台)都不代表它。这并不意味着他们不使用UTC。不管怎样,它都与这里所问的问题无关。@mat:它与所问的问题有关。GMT和UTC之间存在差异(即闰秒)。我不确定你对“绝大多数”的定义。CC++已经确认了对不同的时钟(包括UTC)的需要,它们确实执行了正式的规范。