еще один вопрос о указываете ей и DSTСистемный вызов указываете ей игнорирует tm_isdst флаг
Linux, Ubuntu, часовой пояс установлен в Европе/Берлин т.е. текущее время является CEST:
>date
Mon Aug 22 16:08:10 CEST 2016
>date --utc
Mon Aug 22 14:08:14 UTC 2016
все хорошо до сих пор.
Теперь я пытаюсь запустить следующий код:
#include <stdio.h>
#include <time.h>
int main()
{
struct tm tm = {0};
int secs;
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 12;
tm.tm_mon = 9 - 1;
tm.tm_mday = 30;
tm.tm_year = 2016 - 1900;
tm.tm_isdst = 0;
secs = mktime(&tm);
printf("%i\n", secs);
tm.tm_isdst = 1;
secs = mktime(&tm);
printf("%i\n", secs);
tm.tm_isdst = -1;
secs = mktime(&tm);
printf("%i\n", secs);
return 0;
}
и получить
1475233200
1475233200
1475233200
, который во всех трех случаях неправильно (1 час смещение):
>date -d @1475233200
Fri Sep 30 13:00:00 CEST 2016
Так Я немного озадачен, мой временной интервал как-то сломан? Почему флаг tm_isdst полностью игнорируется?
Редактировать: @Nominal Animal получил ответ: mktime изменяет tm_hour! Интересно, где это задокументировано ?!
#include <stdio.h>
#include <time.h>
void reset(struct tm* tm){
(*tm) = (const struct tm){0};
tm->tm_sec = 0;
tm->tm_min = 0;
tm->tm_hour = 12;
tm->tm_mon = 9 - 1;
tm->tm_mday = 30;
tm->tm_year = 2016 - 1900;
}
int main()
{
struct tm tm;
int secs;
reset(&tm);
tm.tm_isdst = 0;
secs = mktime(&tm);
printf("%i\n", secs);
reset(&tm);
tm.tm_isdst = 1;
secs = mktime(&tm);
printf("%i\n", secs);
reset(&tm);
tm.tm_isdst = -1;
secs = mktime(&tm);
printf("%i\n", secs);
return 0;
}
дает
1475233200
1475229600
1475229600
1) Поведение кажется странным. Чтобы сбросить ошибку _better_, сбросьте все ** поля ** (или, по крайней мере, распечатайте их) после вызова 'mktime (&tm);' as 'mktime()' может корректировать поля 'tm'. 2) Использовать соответствующий спецификатор формата, например' printf ("% i \ n", (int) secs); 'или' printf ("% lld \ n", (long long) secs); ', чтобы избежать неопределенного поведения. – chux
Это может показаться странным, но это действительно не странно. Действительно, ['mktime()'] (http://man7.org/linux/man-pages/man3/mktime.3.html) изменяет свой аргумент - в частности, 'tm.tm_hour' и' tm. tm_isdst' в этом случае. –
@Nominal Animal Что означает 'odd', так это то, что' mktime() 'не ожидается, чтобы изменить' tm', поскольку 'tm' находится в основном диапазоне в первых двух случаях. _ahh_, возможно, не в первом случае. Hmmm - a dst of 0 в летнее время может измениться до 1. – chux