2012-04-10 4 views
0

My timezone is United States Восточное стандартное время, которое на 5 часов меньше, чем UTC. Учитывая, что:Конвертация UTC в местное время

struct tm t = { 0, 30, 15, 10, 3, 112, 0, 0, -1 }; 
time_t utc_in_timet = _mkgmtime(&t); 

struct tm tt = { 0 }; 
localtime_s(&tt, &utc_in_timet); 

tt отключен на один час, когда localtime_s возвращается. У меня 11:30 вместо 10:30.

Что мне не хватает?

ответ

1

Я пробовал свой код на своей машине и работает правильно (мой часовой пояс GMT + 2). Так как вы сообщаете своей системе, чтобы проверить самосохранение (последний параметр для tm - -1), он фактически использует EDT и, таким образом, дает вам GMT-4.

Вы можете попробовать заменить месяц (3) на 2, чтобы дата была 10 марта, незадолго до изменения дневного времени; Бьюсь об заклад, вы получите ожидаемый 10:30 в этом случае.

+0

Я тоже это заметил. Установка tm_isdst на 1 в значительной степени будет иметь тот же эффект, не так ли? – ForeverLearning

+0

Должен быть какой-то общий способ конвертировать UTC в локальное время, беря на себя переход на летнее время, не так ли? – ForeverLearning

+0

Да, установка 'tm_isdst' на' 1' будет иметь такой же эффект в этом случае. – Gorpik

3

Я думаю, что это как-то связано с летним временем. Вы уверены, что ваш часовой пояс в настоящий момент является EST (-5)? Потому что кажется, что ваша система должна использовать EDT (-4)?

+0

мой часовой пояс определенно установлен в EST. Кроме того, этот код отключен на час, даже когда коллега попробовал его в Великобритании. Я верю, что он вернулся 16:30, когда localtime_s вернулся (или 14:30 - я не могу вспомнить) – ForeverLearning

+0

Ну, я также пробовал это: http://www.timeanddate.com/worldclock/converter.html Когда я конвертирую к EST-New York, он автоматически использует летнее время. Я также даю это предупреждение для EST: «В настоящее время в EST есть только некоторые местоположения, потому что большинство мест в настоящее время находятся на летнем времени». Поэтому я действительно думаю, что часовой пояс, который вы используете, - EST с летним временем (= EDT) – rve

0

Считается, что проблема заключается в том, что месяц: struct tm t = {0, 30, 15, 10, , 112, 0, 0, -1}; Тогда это проблема с летним временем. Но, как указывает Горпик ниже, «месяцы идут от 0 до 11, так что в апреле действительно 3».

Итак, я проверил - он показывает 18:30 в Хайфе, что является правильным + 2UTC.

+0

Это неправильно. В 'tm', месяцы идут от 0 до 11, поэтому апрель действительно' 3'. – Gorpik

+0

Да, просто хотел удалить сообщение. Но вы печатаете быстрее. – SChepurin

+0

Извините за это :) – Gorpik

1

Проверьте местный часовой пояс. И Англия (например, Лондон), и восточное побережье США в настоящее время находятся в летнее время, поэтому это выглядит проблемой (как уже упоминалось ранее). Для восточного побережья США ЭДТ будет 4 часа.

Смежные вопросы