M. Ответ MARIE на самом деле не работает для поставленного вопроса: tzset () - это POSIX, но не ANSI C, как указано в заголовке исходного вопроса. Ни в C90, ни в C99 об этом не упоминается (из поиска проектов стандартов; у меня нет доступа к окончательным стандартам).
Вопрос OP, возможно, немного расплывчат, поскольку неясно, что он имеет в виду под "временем без ответа", но, вероятно, он имеет в виду сломанные компоненты, скажем, заполненные в struct tm
.
В C99 можно определить смещение локального TZ от UTC, анализируя вывод strftime("%z",...)
(убедитесь, что вы вызываете его со своими собственными значениями даты, так как это смещение будет меняться со временем); но этот код формата недоступен в C90, поэтому AFAIK вам не повезло, если вы должны соответствовать C90, если только вы не хотите попытаться проанализировать вывод strftime("%Z",...)
, но это будет принципиально непереносимо.
Затем вы можете преобразовать свои компоненты UTC в time_t
, используя mktime()
, хотя они будут интерпретироваться как в местном часовом поясе; затем примените смещение и преобразуйте обратно в сломанные компоненты, используя localtime()
. Вы можете столкнуться с крайними случаями примерно в то время, когда ваш местный часовой пояс переключается на летнее время и обратно (или когда происходит смещение часового пояса, когда это происходит), но этого можно легко избежать, перейдя в локаль, которая не использует летнее время, или установка tm_dst
в 0
при вызове strftime()
и mktime()
.
В качестве альтернативы, не ограничивайте себя ANSI C.