Я реализовал код эпохи к дате / времени, упомянутый в вопросе «Преобразование между датой / временем и отметкой времени без использования процедур библиотеки std», Барак Манос, 29 декабря 2013 года.
У меня проблема с вычисленным днем.Другие вычисленные значения в порядке.Я использую NTP-секунды, начиная с эпохи 1900 года. Я пытался использовать NTP-секунды с эпохи 1970 года, но, похоже, это не очень хорошо работает, поэтому я предполагаю, что этот код предпочитает эпоху 1900 секунд.
Я всегда вычисляюдень, который на 1 меньше, чем фактический день.Например, сегодняшняя дата = 2018-12-10.Я получаю значение = 3753407101 с NTP-сервера.
Расчетное время (чч: мм: сс) является точным, а вычисленные год и месяц точными, но день вычисляется как 9, а не 10Используя калькулятор, я получаю те же результаты.
Используя калькулятор:
UINT_32 epoch;
UINT_32 years;
UINT_32 year;
UINT_32 month;
const UINT_32 days[4][12] =
{
//Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335},
{ 366, 397, 425, 456, 486, 517, 547, 578, 609, 639, 670, 700},
{ 731, 762, 790, 821, 851, 882, 912, 943, 974,1004,1035,1065},
{1096,1127,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430}
};
//NTP Server 131.107.13.100 reply = epoch 1900 seconds = 3753407101.
date time->second = epoch%60; //1.
epoch /= 60; //62556785.
date_time->minute = epoch%60; //5.
epoch /= 60; //1042613.
date_time->hour = epoch%24; //5.
epoch /= 24; //43442.
years = epoch/(365*4+1) * 4; //(43442/1461) * 4 = 116.
epoch %= 365*4+1; //43442%1461 = 1073.
if (epoch >= days[year][0]) //1073 > (days[2][0] = (731)). year = 2.
if (epoch >= days[year][month]) //1073 > (days[2][11] = (1065)). month=11.
date_time->year = years + year; //116 + 2 = 118.
date_time->month = month + 1; //11 + 1 = 12.
date_time->day = epoch - days[year][month] + 1; //1073 - 1065 + 1 = 9.
//day should = 10.
//NOTE - Using epoch 1970 seconds, 3753407101 - 2208988800 = 1544418301,
//produces the same result, day = 9, instead of 10.
Любая помощь приветствуется.Я работаю с 16-битным uP и без ядра, так что алгоритм, который не зависит от библиотеки C, это как раз то, что я искал.Сейчас я работаю с UTC, GMT, и не беспокоюсь о часовом поясе (-5 часов).
Спасибо,
Стивен