Я использую библиотеку C++ даты Говарда Хиннанта (https://howardhinnant.github.io/date/date.html), но у меня возникают некоторые затруднения при его использовании. Ниже приведена программа, в которой я использую эту библиотеку для печати года-месяца-дня 3-й пятницы ноября 2017 года. Класс date::year_month_weekday
при использовании с date::sys_days()
показывает правильную дату (17 ноября 2017 года), но когда я ее конвертирую на struct tm
с std::chrono::system_clock::to_time_t
, результаты, хранящиеся в этом tm
, становятся 16 ноября 2017 года. Я тестировал другие случаи, кажется, что struct tm
преобразуется из date::year_month_weekday
всегда на один день позже. Я что-то пропустил в своей программе? Программа указана ниже, для ее компиляции требуется C++ 11.
#include <iostream>
#include <chrono>
#include <sys/time.h>
#include "date.h"
using namespace std;
using namespace std::chrono;
using namespace date;
int main(int argc, char *argv[]) {
date::year y(2017);
date::month m(11);
date::weekday wd((unsigned)5);
date::weekday_indexed wi(wd,3);
date::year_month_weekday dmwd(y, m, wi);
std::cout << date::sys_days(dmwd) << std::endl; //prints 2017-11-17, which is the 3rd Friday of Nov 2017
time_t tt = std::chrono::system_clock::to_time_t(date::sys_days(dmwd));
struct tm tm1;
localtime_r(&tt, &tm1);
std::cout << "tm1.tm_year = " << tm1.tm_year << std::endl;
std::cout << "tm1.tm_mon = " << tm1.tm_mon << std::endl;
std::cout << "tm1.tm_mday = " << tm1.tm_mday << std::endl; //prints 16 instead of 17, one day behind. tm.mday is from 1 to 31.
return 0;
}
Вывод этой программы выглядит следующим образом
2017-11-17
tm1.tm_year = 117 <-- 117+1900=2017
tm1.tm_mon = 10 <-- tm_mon starts form 0, so 10 means November
tm1.tm_mday = 16 <-- tm_mday starts from 1, so 16 is the 16-th day in a month
gmtime_r()
вместоlocaltime_r()
? - person Freddie Chopin   schedule 25.03.2017gmtime_r
дал стабильный результат, спасибо за подсказку. Посколькуdate::year_month_weekday
не содержит информации о времени (часах и минутах), мне интересно, как библиотека дат справляется с этим при преобразовании вstruct tm
. Я также печатаюtm_hour
иtm_min
изstruct tm
, преобразованных изdate::year_month_weekday
. Кажется,tm_hour == 18
иtm_min == 0
для всех случаев - возможно, потому что я нахожусь в часовом поясе UTC-6? - person Work Only   schedule 25.03.2017dmwd
:auto dmwd = fri[3]/nov/2017;
- person Howard Hinnant   schedule 25.03.2017