Как преобразовать дату и время UT C в указанный часовой пояс? - PullRequest
1 голос
/ 05 марта 2020

Кажется простым, но я не нашел способа конвертировать время в формате UT C в указанный часовой пояс. Я нашел, как преобразовать UT C дату и время в местное время, но теперь я хочу преобразовать в определенный c часовой пояс (например, по московскому времени)

Например, в 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?

1 Ответ

8 голосов
/ 05 марта 2020

Несколько вещей:

  • "Antarctica/South Pole Standard Time" не является идентификатором зоны реального времени. Я предполагаю, что вы дали это в шутку, но неясно, хотите ли вы использовать Windows идентификаторы часовых поясов (например, "Eastern Standard Time") или идентификаторы часовых поясов IANA (например, "America/New_York").

  • Если вы хотите использовать Windows идентификаторы, вы действительно можете использовать функции в Win32 API. Комментарий в вопросе предложил неправильный API однако. Вместо этого вы должны использовать SystemTimeToTzSpecificLocalTimeEx.

    • . Используется структура DYNAMIC_TIME_ZONE_INFORMATION, которая доступна с Windows Vista. Чтобы получить один из них из названного Windows идентификатора часового пояса, используйте функцию EnumDynamicTimeZoneInformation для l oop через системные часовые пояса, пока вы не найдете совпадение в поле TimeZoneKeyName.
    • Структуры «dynamici c» важны для использования и всегда должны быть предпочтительнее, чем их более старые аналоги. Они предоставляют доступ к изменениям часовых поясов и правилам перехода на летнее время, которые хранятся в реестре Windows. Без них вы получите доступ только к текущему правилу, которое может быть неправильным правилом для даты, которую вы конвертируете.
  • Если вы вместо этого Если вы хотите использовать идентификаторы часового пояса IANA, используйте библиотеку Delphi tzdb , как показано в этом сообщении .

    • Если вы не уверены, какой использовать, я очень рекомендую этот подход. Идентификаторы IANA взаимодействуют с другими операционными системами, языками программирования, платформами и библиотеками. (Windows идентификаторы, меньше.)
...