Почему mktime () изменяет день года моей структуры tm?
Я прочел в две строки с год, Юлианский день (год, день), час, минута, и наблюдение.
Я извлекаю соответствующие переменные с помощью sscanf:
sscanf(tide_str1.c_str(), "%d %d %d %d %Lf", &y1, &j1, &h1, &m1, &obs1);
sscanf(tide_str2.c_str(), "%d %d %d %d %Lf", &y2, &j2, &h2, &m2, &obs2);
Для этого конкретного набора данных значения 2011 083 23 22 1.1
Затем я создаю и заполняю структуру tm и запускаю mktime с вызовами cout в день между ними, и он изменяется от 083 до 364.
int y1=2011, j1=83, h1=23, m1=22;
struct tm time_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0}, *time_ptr = &time_struct;
time_t tv_min;
time_struct.tm_year = y1 - 1900;
time_struct.tm_yday = j1;
cout << time_struct.tm_yday << endl;
time_struct.tm_hour = h1;
time_struct.tm_min = m1;
time_struct.tm_isdst = -1;
cout << time_struct.tm_yday << endl;
tv_min = mktime(time_ptr);
cout << time_struct.tm_yday << endl;
Почему это? Это потому, что tm_mday и tm_mon имеют значение 0? Поначалу я старался не делать этого. инициализируя все это до нуля, но затем mktime вернул -1. Что я должен делать по-другому, если я знаю только день года, а не месяц и день месяца?
1 ответ:
mktime()
он делает то, что должен делать.Цитируя стандарт C:
Функцияmktime преобразует разбитое время, выраженное как местное время, в структуре, указанной timeptr в календаре значение времени с той же кодировкой, что и у значений, возвращаемых функцияtime . Исходные значения tm_wday и tm_yday компоненты структуры игнорируются, и исходные значения других компонентов не ограничены диапазонами указанный выше. При успешном завершении значения tm_wday иtm_yday компоненты структуры задаются соответствующим образом, а другие компоненты задаются для представления задается календарное время, но при этом их значения форсируются в диапазоны указано выше; конечное значение tm_mday не устанавливается до tm_mon и tm_year являются определенный.
Однако то, что вы можете сделать, - это инициализировать
mktime()
может вычислять значенияtm_mday
иtm_yday
из других членов; он не предназначен для вычисления значений других членов из этих полей.struct tm
со значениями вне диапазона. Например, если вы хотите, чтобыtm_yday
было 200 (200-й день года), вы можете инициализироватьstruct tm
, представляющий 200-й день января.mktime()
затем нормализует его до правильной даты, получая значениеtime_t
, которое вы можете затем подавайте наgmtime()
илиlocaltime()
.Вот простой пример:
#include <iostream> #include <ctime> int main() { struct tm t = { 0 }; t.tm_sec = t.tm_min = t.tm_hour = 0; // midnight t.tm_mon = 0; // January t.tm_year = 2012 - 1900; t.tm_isdst = -1; // unknown t.tm_mday = 200; // January 200th? time_t when = mktime(&t); const struct tm *norm = localtime(&when); // Normalized time std::cout << "month=" << norm->tm_mon << ", day=" << norm->tm_mday << "\n"; std::cout << "The 200th day of 2012 starts " << asctime(norm); }
Вывод:
month=6, day=18 The 200th day of 2012 starts Wed Jul 18 00:00:00 2012