Epoch Преобразование секунд в дату / время без использования функций библиотеки C - PullRequest
0 голосов
/ 11 декабря 2018

Я реализовал код эпохи к дате / времени, упомянутый в вопросе «Преобразование между датой / временем и отметкой времени без использования процедур библиотеки 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 часов).

Спасибо,

Стивен

...