mktime возвращает неправильную метку времени (отклоняется на целый месяц)

Я использую mktime для создания временной метки unix из моего текущего местного времени:

#include <time.h>

int _tmain(int argc, _TCHAR* argv[])
{
  struct tm info;

  // 16.05.2014
  info.tm_mday = 16;
  info.tm_mon = 5;
  info.tm_year = 114; // Years since 1900

  // 08:00:00 Uhr
  info.tm_hour = 8;
  info.tm_min = 0;
  info.tm_sec = 0;

  // Convert to Unix timestamp
  info.tm_isdst = -1;
  time_t timestamp = mktime(&info);
  printf("Timestamp: %i", timestamp);
}

Это дает мне:

1402898400

При преобразовании этого обратно в удобочитаемое время (через какой-то веб-сайт) это переводится как:

16.06.2014 08:00:00

Как видите, это на один месяц меньше, чем я ожидал (поставил в мае (5), вышел в июне (6)). Почему?


person Boris    schedule 16.05.2014    source источник


Ответы (1)


C11 7.27.1 Компоненты времени

int tm_sec; // seconds after the minute — [0, 60]
int tm_min; // minutes after the hour — [0, 59]
int tm_hour; // hours since midnight — [0, 23]
int tm_mday; // day of the month — [1, 31]
int tm_mon; // months since January — [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday — [0, 6]
int tm_yday; // days since January 1 — [0, 365]
int tm_isdst; // Daylight Saving Time flag

tm_mon начинается с 0, а не 1. Таким образом, значение 5 означает, что сейчас июнь, а не май.

person Yu Hao    schedule 16.05.2014
comment
5 означает июнь, а не апрель - person Chemik; 16.05.2014
comment
Вау, так дни начинаются с 1, месяцы с 0? Арх! - person Boris; 16.05.2014
comment
@Борис, действительно. Такие вещи заставляют вас отлаживать в течение дня. - person UmNyobe; 16.01.2015