Почему _localtime32 и _gmtime32 возвращают одно и то же значение времени для часового пояса, отличного от GMT? - PullRequest
2 голосов
/ 16 марта 2012

Мой часовой пояс установлен на CDT в панели управления Апплет даты / времени.

Следующий код помещает точно такие же дату и время в pCurGmtTime и pCurTime:

int main(int argc, char *argv[])
{
  __time32_t t=_time32(NULL);

  tm *pCurGmtTime=_gmtime32(&t);
  tm *pCurTime=_localtime32(&t);

  // The values in the *pCurGmtTime structure are equal to the values in *pCurTime

  return 0;
}

У меня не установлена ​​переменная среды TZ, но мой часовой пояс правильно настроен для системы через апплет «Дата и время» на панели управления. Такое поведение противоречит документации MSDN для этих функций, в которой говорится, что TZ переопределяет настройки панели управления, но если она отсутствует, будут использованы настройки панели управления.

Спасибо

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Поскольку указатель, возвращаемый обоими этими вызовами, указывает на одну и ту же внутреннюю структуру:

http://msdn.microsoft.com/en-us/library/bf12f0hc(v=vs.80).aspx

И 32-битная, и 64-битная версии gmtime, mktime, mkgmtime и localtime используют одну структуру tm для каждого потока для преобразования. Каждый вызов одной из этих подпрограмм уничтожает результат предыдущего вызова.

Ваш второй вызов (_localtime32()) перезаписывает значения из первого вызова. Если бы вы сравнили значения указателей сами, вы бы увидели, что они одинаковы.

Если вы используете версии _s, как указано в верхней части документации, у вас не возникнет этой проблемы, поскольку вам придется передать свой собственный struct *tm.

3 голосов
/ 16 марта 2012

Поскольку

И 32-разрядные, и 64-разрядные версии gmtime, mktime, mkgmtime и localtime используют одну структуру tm для каждого потока для преобразования.

Второй вызов записывает данные в то же место, что и предыдущий.Вам необходимо скопировать данные в другое место перед вызовом localtime.

...