Windows 如何将UTC日期时间转换为指定时区?
看起来很简单,但我没有找到将UTC日期时间转换为指定时区的方法。我找到了如何将UTC日期时间转换为本地日期时间,但现在我想转换为特定时区(例如莫斯科时间) 例如,在c#中,我们可以做到: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
// 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注册表中的时区和夏令时规则的更改。如果没有它们,您只能访问当前规则,这可能不是转换日期的正确规则
- 它使用自Windows Vista以来一直可用的结构。要从命名的Windows时区标识符中获取其中一个时区,请使用函数在系统时区中循环,直到在
- 如果您希望使用IANA时区标识符,请使用,如图所示
- 如果您不确定使用哪种方法,我强烈推荐这种方法。IANA标识符可与其他操作系统、编程语言、框架和库相互操作。(Windows标识符,较少如此。)
不是实时时区标识符。我想你是开玩笑说的,但它不清楚你是想使用Windows时区标识符(如“南极洲/南极标准时间”
),还是IANA时区标识符(如“东部标准时间”
)“美国/纽约”
- 假设您想使用Windows标识符,您确实可以使用Win32 API中的函数。然而,问题中的评论暗示了错误的API。你应该改为使用
- 它使用自Windows Vista以来一直可用的结构。要从命名的Windows时区标识符中获取其中一个时区,请使用函数在系统时区中循环,直到在
字段中找到匹配的时区TimeZoneKeyName
- “动态”结构的使用非常重要,应始终优先于旧结构。它们允许访问存储在Windows注册表中的时区和夏令时规则的更改。如果没有它们,您只能访问当前规则,这可能不是转换日期的正确规则
- 它使用自Windows Vista以来一直可用的结构。要从命名的Windows时区标识符中获取其中一个时区,请使用函数在系统时区中循环,直到在
- 如果您希望使用IANA时区标识符,请使用,如图所示
- 如果您不确定使用哪种方法,我强烈推荐这种方法。IANA标识符可与其他操作系统、编程语言、框架和库相互操作。(Windows标识符,较少如此。)
- 有几件事:
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)的需要,它们确实执行了正式的规范。