Если местное время изменяется на 30 минут для перехода на летнее время, то один раз в год происходит 30 минут местного времени, которые происходят дважды (один раз с переходом на летнее время и один раз без), и еще 30 минут, когда происходит никогда (оно пропускается, когда время меняется).
Таким образом, местное время в течение 30 минут после установки часов неоднозначно, если не указано, действует ли DST;Есть два фактических момента времени, которым они могут соответствовать.
Местное время в течение 30 минут с момента, когда часы установлены заранее, недействительно;нет фактических моментов времени, которым они могли бы соответствовать (хотя преобразование могло бы все еще быть сделано, предполагая, что летнее время действует, или не действует).
Так для некоторых локальных времен (игнорируя состояние летнего времени)может быть более одного соответствующего времени UTC, но для любого данного времени UTC есть только одно возможное местное время (если корректировки DST учтены должным образом).
Когда вы звоните mktime
, это преобразовывает местноевремя, которое вы даете ему time_t, как если бы DST действовал или нет, в зависимости от значения tm_isdst
.Исправленные значения, которые вы получите, основаны на обратном преобразовании, и система определит, получите ли вы время DST или время не-DST, в зависимости от ее представления о том, действует ли DST во время преобразования.Время, которое вы дали, и время, которое вы вернули, фактически представляют один и тот же момент времени, но с различными смещениями от UTC из-за различных состояний летнего времени.
Так что да, это правильное поведение mktime
,Предполагается, что она нормализует значения в структуре в соответствии с ее идеей о том, как правильно представлять время, которое вы ей дали.
Это также иллюстрирует, почему следует соблюдать осторожность при использовании локального времени для отслеживания фактических событий -- если состояние DST или смещение от UTC не сохраняются вместе со временем, некоторые значения местного времени могут быть неоднозначными.