我已经实现了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小时)。
谢谢
史蒂芬