mktime() возвращает неверное значение сразу после ввода DST

#dst #busybox #mktime #real-time-clock #hwclock

Вопрос:

Следующий фрагмент кода взят из rtc.c busybox-1.22.1 .

В моем случае значение utc всегда равно 0, поэтому эта функция просто выполняет преобразование из struct tm в time_t .

 time_t FAST_FUNC rtc_tm2time(struct tm *ptm, int utc)
{
    //fprintf(stdout, "ptm->tm_hour: %dn", ptm->tm_hour);
    char *oldtz = oldtz; /* for compiler */
    time_t t;

    if (utc) {
        oldtz = getenv("TZ");
        putenv((char*)"TZ=UTC0");
        tzset();
    }

    t = mktime(ptm); //problem here
    //struct tm* temp = localtime(amp;t);
    //fprintf(stdout, "temp->tm_hour: %dn", temp->tm_hour);

    if (utc) {
        unsetenv("TZ");
        if (oldtz)
        {
            putenv(oldtz - 3);
        }
        tzset();
    }

    return t;
}
 

Кроме того, существует файл /etc/TZ , отображающий информацию о часовом поясе и DST.

 ~ # cat /etc/TZ
LMT0:00LMT-1:00,M8.5.1/10,M12.5.1/10
 

Затем я установил системное время на 2021/8/30, 9:59:30 (на 30 секунд раньше даты начала по восточному времени) и синхронизируюсь с hwclock.

 date -s 2021.08.30-09:59:30 >/dev/null 2>/dev/null //set system time
hwclock -w //sync RTC to system time
 

Непрерывно вводите hwclock, наблюдая за выводом в CLI.

 ~ # hwclock
ptm->tm_hour : 9
temp->tm_hour : 9
Mon Aug 30 09:59:58 2021  0.000000 seconds

~ # hwclock
ptm->tm_hour : 10
temp->tm_hour : 11 //why not 10?
Mon Aug 30 11:00:00 2021  0.000000 seconds
 

Почему возвращаемое значение from mktime добавляется на 1 при вводе DST? Разве на это не должно повлиять летнее время?