打印

求教:任意时间的年月日时分秒换算成秒数算法

[复制链接]
11857|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wnch|  楼主 | 2007-6-13 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
conwh| | 2007-6-14 09:58 | 只看该作者

这个得找天文台的

使用特权

评论回复
板凳
古道热肠| | 2007-6-14 10:21 | 只看该作者

这个在VB中是很容易的,有现成的函数

  单片机也是可以算出来的,首天要计算出间隔天数,再用天数*24*60*60,再加上零头,计算天数时要用到润年的概念,你这个似乎意义不大,我见过计算当前日期与1980年1月1月0时差多少小时的程序。

使用特权

评论回复
地板
conwh| | 2007-6-14 10:35 | 只看该作者

每年的时间可不是固定的

使用特权

评论回复
5
wnch|  楼主 | 2007-6-14 11:33 | 只看该作者

首先先谢过各位的支持

如楼上所说,因为每年的时间不是固定的。所以这个天数就不好求出来。
如果用比较原始的方法,可以用查表法来做。先计算好从1900年开始,相隔一年,两年。。。。。到N年的天数,其中N取136年。即到2036年。把这个相隔年天数做成一个表格,那么根据现在年和1900年之差来通过上表格查出天数,再加上零头求得总天数,再转换成秒,但是因为是放在单片机里面计算,这样觉得表格不小,而且要手工计算这个表格觉得方法不好。
还有,这个计算意义甚大,因为这个是实现简单网络时间协议(SNTP)的基础。希望各位能不惜赐教。期盼中。。。。。。。

使用特权

评论回复
6
gyt| | 2007-6-14 11:34 | 只看该作者

放入处理闰年的内容即可

这样就可以算出准确的天数

使用特权

评论回复
7
wowow| | 2007-6-14 13:20 | 只看该作者

C函数库里面一般都有转换函数

至于执行效率如何就不知道了. 我的程序由于在产品内部应用的,自己做了些限定,只从2001.1.1开始计,31bit的计数器有68年足够我用了,这样在年限范围内闰年的规则就简单了.

使用特权

评论回复
8
conwh| | 2007-6-14 13:36 | 只看该作者

5L的,理解错误。

我说每年时间是不相同的,不是指天数,而是包括每年天数的秒数。

使用特权

评论回复
9
gyt| | 2007-6-14 15:00 | 只看该作者

对了

有时候会有加一秒之类的情况发生

使用特权

评论回复
10
wnch|  楼主 | 2007-6-15 09:35 | 只看该作者

期盼各位继续

昨天我又查找了一些资料,确实如楼上两位所说,有时候1分钟里面会有59秒或者61秒的情况出现,但没有找到怎么去判断的方法,希望各位能继续指教。期盼中。。。。。

使用特权

评论回复
11
gyt| | 2007-6-15 09:41 | 只看该作者

不能

这个是不能判断的,是天文台按照实际情况决定的:)

使用特权

评论回复
12
lixun00| | 2007-6-15 10:06 | 只看该作者

单片机要精确计算,估计只能查表,运算量。。。

使用特权

评论回复
13
32768Hz| | 2007-6-15 21:02 | 只看该作者

给你个把年月日时分秒换算成从2000年开始的秒数算法

//年份表
uint code gYearTable[100] = {0,  366,  731, 1096, 1461, 1827, 2192, 2557, 2922, 3288,
        3653, 4018, 4383, 4749, 5114, 5479, 5844, 6210, 6575, 6940,
        7305, 7671, 8036, 8401, 8766, 9132, 9497, 9862,10227,10593,
        10958,11323,11688,12054,12419,12784,13149,13515,13880,14245,
        14610,14976,15341,15706,16071,16437,16802,17167,17532,17898,
        18263,18628,18993,19359,19724,20089,20454,20820,21185,21550,
        21915,22281,22646,23011,23376,23742,24107,24472,24837,25203,
        25568,25933,26298,26664,27029,27394,27759,28125,28490,28855,
        29220,29586,29951,30316,30681,31047,31412,31777,32142,32508,
        32873,33238,33603,33969,34334,34699,35064,35430,35795,36160 };

//非闰年
uint code gMonthTable1[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
//闰年
uint code gMonthTable2[12] = {0,31,60,91,121,152,182,213,244,274,305,335};

/*--------------------------------------------------------------------------
功能: 将时间串转换成以2000起始的秒数
buf : year(1bcd),month,date,hour,minute,second
--------------------------------------------------------------------------*/
ulong timestr2long(uchar *buf)
{
    ulong tlong;
    uchar ch,ch1;
    ch = (buf[0]/16)*10+buf[0]%16;
    tlong = (ulong)((uint)gYearTable[ch]);
    ch1 = (buf[1]/16)*10+buf[1]%16;
    if(ch%4 == 0)
        tlong += (ulong)((uint)gMonthTable2[ch1-1]);
    else
        tlong += (ulong)((uint)gMonthTable1[ch1-1]);
    ch = (buf[2]/16)*10+buf[2]%16;
    tlong += (ulong)((uchar)(ch-1));
    tlong *= 24;
    ch = (buf[3]/16)*10+buf[3]%16;
    tlong += (ulong)((uchar)ch);
    tlong *= 60;
    ch = (buf[4]/16)*10+buf[4]%16;
    tlong += (ulong)((uchar)ch);
    tlong *= 60;
    ch = (buf[5]/16)*10+buf[5]%16;
    tlong += (ulong)((uchar)ch);
    return tlong;
}

使用特权

评论回复
14
dictionary| | 2015-12-8 11:03 | 只看该作者
unsigned long mktime(const unsigned int year0, const unsigned int mon0,
       const unsigned int day, const unsigned int hour,
       const unsigned int min, const unsigned int sec)
{
        unsigned int mon = mon0, year = year0;

        /* 1..12 -> 11,12,1..10 */
        if (0 >= (int) (mon -= 2)) {
                mon += 12;        /* Puts Feb last since it has leap day */
                year -= 1;
        }

        return ((((unsigned long)
                  (year/4 - year/100 + year/400 + 367*mon/12 + day) +
                  year*365 - 719499
            )*24 + hour /* now have hours */
          )*60 + min /* now have minutes */
        )*60 + sec; /* finally seconds */
}
从linux 内核找的,至于怎么返回回去还没找到

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

54

帖子

0

粉丝