инфо-страницы для команды GNU date
содержит этот пример:Как программно преобразовать время из одного часового пояса в другое в C?
Например, с
date
команды GNU вы можете ответить на этот вопрос «Сколько времени в Нью-Йорке, когда часы Париж показывает 6 : 30am октября 31, 2004? " с использованием даты начала с `TZ =«Европа/Париж»« как показано в следующей оболочки расшифровку:$ export TZ="America/New_York" $ date --date='TZ="Europe/Paris" 2004-10-31 06:30' Sun Oct 31 01:30:00 EDT 2004
В этом примере „--date“ операнд начинается с его собственной»TZ ' настройка, поэтому остальная часть этого операнда обрабатывается в соответствии с правилами ' Европа/Париж ', обрабатывая строку
2004-10-31 06:30
, как будто она находилась в Париже. Однако, поскольку выход командыdate
составляет , обработанный в соответствии с правилами часового пояса , он использует время в Нью-Йорке . (Париж был обычно шесть часов вперед в Нью-Йорке в 2004 году, но это пример относится к краткому Хэллоуин период, когда разрыв в пять часов.)
Я пытаюсь сделать по существу то же самое программно в C без вызова программы date
миллионы раз. В основном я ищу способ принять произвольную дату и время в одном часовом поясе и преобразовать его в эквивалентную дату и время в другой часовой пояс либо напрямую, либо путем преобразования в и из UTC. Мне не нужны форматы ввода и вывода, если я могу ими управлять, используя стандартные функции (strftime
/strptime
/mktime
/etc).
Программа date
, как представляется, выполняет это, используя сложные процедуры внутри пакета coreutils
. Я ищу способ сделать это на C, используя стандартные подпрограммы POSIX/Linux или внешнюю библиотеку. Я посмотрел на zoneinfo совсем немного, что казалось многообещающим, но я не могу найти никаких библиотек, чтобы делать с ними что-нибудь полезное.
Существует ряд тонких вопросов, связанных с ручными расчетами, которые я пытаюсь избежать, например, с помощью DST. Эта информация содержится в базе данных zoneinfo, но не настолько полезной для меня до сих пор. –
Например, эта работа особенно плохо в Венесуэле - это официально UTC-4: 30 – Quintus