纪元至日期/时间转换,无需使用C库函数

时间:2018-12-11 00:24:06

标签: epoch ntp

我已经实现了epoch-to-Date / Time代码,在一个问题中提到 巴拉克·马诺斯(Barak Manos)在2013年12月29日发表的“不使用std库例程的情况下在日期/时间和时间戳之间进行转换”。

我的计算日有问题。其他计算值也可以。从1900年以来,我一直在使用NTP秒。自1970年以来,我一直在尝试使用NTP秒,但是,这似乎不太起作用,因此,我假设这段代码更喜欢1900秒。

我总是计算一天,比实际天少1天。例如,今天的日期= 2018-12-10。我从NTP服务器中获取了一个值= 3753407101。

计算出的时间(hh:mm:ss)是准确的,计算出的年份和月份是正确的,但是,一天的计算结果为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小时)。

谢谢

史蒂芬

0 个答案:

没有答案