2014-11-06 02:39:48 +00:00
|
|
|
|
#include <cstring>
|
2009-05-28 18:19:51 +00:00
|
|
|
|
#include <Yandex/DateLUT.h>
|
2014-07-08 23:52:53 +00:00
|
|
|
|
#include <Poco/Exception.h>
|
2009-05-28 18:19:51 +00:00
|
|
|
|
|
|
|
|
|
|
2013-08-11 03:40:14 +00:00
|
|
|
|
DateLUT::DateLUT()
|
2009-05-28 18:19:51 +00:00
|
|
|
|
{
|
2014-07-08 23:52:53 +00:00
|
|
|
|
size_t i = 0;
|
2014-11-06 02:39:48 +00:00
|
|
|
|
time_t start_of_day = DATE_LUT_MIN;
|
|
|
|
|
|
|
|
|
|
do
|
2009-05-28 18:19:51 +00:00
|
|
|
|
{
|
2014-07-08 23:52:53 +00:00
|
|
|
|
if (i > DATE_LUT_MAX_DAY_NUM)
|
|
|
|
|
throw Poco::Exception("Cannot create DateLUT: i > DATE_LUT_MAX_DAY_NUM.");
|
|
|
|
|
|
2014-11-06 02:39:48 +00:00
|
|
|
|
tm time_descr;
|
|
|
|
|
localtime_r(&start_of_day, &time_descr);
|
|
|
|
|
|
|
|
|
|
time_descr.tm_hour = 0;
|
|
|
|
|
time_descr.tm_min = 0;
|
|
|
|
|
time_descr.tm_sec = 0;
|
|
|
|
|
time_descr.tm_isdst = -1;
|
|
|
|
|
|
|
|
|
|
start_of_day = mktime(&time_descr);
|
|
|
|
|
|
2014-07-08 23:52:53 +00:00
|
|
|
|
Values & values = lut[i];
|
2013-08-11 03:40:14 +00:00
|
|
|
|
|
2014-11-06 02:39:48 +00:00
|
|
|
|
values.year = time_descr.tm_year + 1900;
|
|
|
|
|
values.month = time_descr.tm_mon + 1;
|
|
|
|
|
values.day_of_week = time_descr.tm_wday == 0 ? 7 : time_descr.tm_wday;
|
|
|
|
|
values.day_of_month = time_descr.tm_mday;
|
2013-08-11 03:40:14 +00:00
|
|
|
|
|
2014-11-06 02:39:48 +00:00
|
|
|
|
values.date = start_of_day;
|
2013-08-11 03:40:14 +00:00
|
|
|
|
|
2014-11-06 02:39:48 +00:00
|
|
|
|
/// Переходим на следующий день.
|
|
|
|
|
++time_descr.tm_mday;
|
2013-08-11 03:40:14 +00:00
|
|
|
|
|
2014-11-06 02:39:48 +00:00
|
|
|
|
/** Обратите внимание, что в 1981-1984 году в России,
|
|
|
|
|
* 1 апреля начиналось в час ночи, а не в полночь.
|
|
|
|
|
* Если здесь оставить час равным нулю, то прибавление единицы к дню, привело бы к 23 часам того же дня.
|
|
|
|
|
*/
|
|
|
|
|
time_descr.tm_hour = 12;
|
|
|
|
|
start_of_day = mktime(&time_descr);
|
2013-08-11 03:40:14 +00:00
|
|
|
|
|
2014-07-08 23:52:53 +00:00
|
|
|
|
++i;
|
2014-11-06 02:39:48 +00:00
|
|
|
|
} while (start_of_day <= DATE_LUT_MAX);
|
2013-08-11 03:40:14 +00:00
|
|
|
|
|
|
|
|
|
/// Заполняем lookup таблицу для годов
|
|
|
|
|
memset(years_lut, 0, DATE_LUT_YEARS * sizeof(years_lut[0]));
|
2014-07-08 23:52:53 +00:00
|
|
|
|
for (size_t day = 0; day < i && lut[day].year <= DATE_LUT_MAX_YEAR; ++day)
|
2013-08-11 03:40:14 +00:00
|
|
|
|
{
|
|
|
|
|
if (lut[day].month == 1 && lut[day].day_of_month == 1)
|
|
|
|
|
years_lut[lut[day].year - DATE_LUT_MIN_YEAR] = day;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
offset_at_start_of_epoch = 86400 - lut[findIndex(86400)].date;
|
2009-05-28 18:19:51 +00:00
|
|
|
|
}
|