Почему std::localtime дает разное смещение от UTC?

#c #date #timezone

Вопрос:

Я нахожусь в Великобритании, поэтому мой часовой пояс в настоящее время совпадает с UTC. В следующем коде, если я передаю разные метки времени в местное время, я получаю разные смещения от UTC (через gmtime). Почему это так? Мой часовой пояс не меняется от звонка к звонку, поэтому я не ожидал, что на смещение повлияет данная метка времени.

 #include <ctime>
#include <iostream>

int main()
{
    for (time_t t = 0; t < 300000000; t =10000000)
    {
        std::tm *timeInfo;

        // Get UTC time
        timeInfo = std::gmtime(amp;t);
        auto gm_hours = timeInfo->tm_hour;

        // Get localtime
        timeInfo = std::localtime(amp;t);

        // Print offset from UTC
        std::cout << "Timestamp: " << t << " Hours ahead of UTC : " << (timeInfo->tm_hour - gm_hours) << std::endl;
    }

    return 0;
}
 

Выход:

 Timestamp: 0 Hours ahead of UTC : 1
Timestamp: 10000000 Hours ahead of UTC : 1
Timestamp: 20000000 Hours ahead of UTC : 1
Timestamp: 30000000 Hours ahead of UTC : 1
Timestamp: 40000000 Hours ahead of UTC : -23
Timestamp: 50000000 Hours ahead of UTC : 1
Timestamp: 60000000 Hours ahead of UTC : 0
Timestamp: 70000000 Hours ahead of UTC : 1
Timestamp: 80000000 Hours ahead of UTC : 1
Timestamp: 90000000 Hours ahead of UTC : 0
Timestamp: 100000000 Hours ahead of UTC : 0
Timestamp: 110000000 Hours ahead of UTC : 1
Timestamp: 120000000 Hours ahead of UTC : 1
Timestamp: 130000000 Hours ahead of UTC : 0
Timestamp: 140000000 Hours ahead of UTC : 1
Timestamp: 150000000 Hours ahead of UTC : 1
Timestamp: 160000000 Hours ahead of UTC : 0
Timestamp: 170000000 Hours ahead of UTC : 1
Timestamp: 180000000 Hours ahead of UTC : 1
Timestamp: 190000000 Hours ahead of UTC : 0
Timestamp: 200000000 Hours ahead of UTC : 1
Timestamp: 210000000 Hours ahead of UTC : 1
Timestamp: 220000000 Hours ahead of UTC : 0
Timestamp: 230000000 Hours ahead of UTC : 1
Timestamp: 240000000 Hours ahead of UTC : 1
Timestamp: 250000000 Hours ahead of UTC : 0
Timestamp: 260000000 Hours ahead of UTC : 1
Timestamp: 270000000 Hours ahead of UTC : 1
Timestamp: 280000000 Hours ahead of UTC : 0
Timestamp: 290000000 Hours ahead of UTC : 0
 

Комментарии:

1. Знаете ли вы о летнем и зимнем времени, возможных изменениях часовых поясов в прошлом?

2. Я думаю, что видео Тома Скотта здесь очень уместно.

3. Да, конечно, но я не понимал, почему это должно изменить представление по местному времени. Мой часовой пояс (или летнее время) не меняется в ходе выполнения программы.

4. @WillPlatts: Но вы спрашиваете о смещении UTC в часовом поясе Великобритании в разные моменты времени . Смещение UTC при выполнении кода не имеет значения.

5. @Кейси, я посмотрю!

Ответ №1:

Великобритания соблюдает летнее время, переходя летом на британское летнее время. Следовательно, если вы пройдете отметку времени, которая относится к той части года, когда действует летнее британское время, вы увидите, что ваше местное время на один час опережает UTC.