闰秒实现

hefa880 2011-11-07 11:46:21
请问有没有实现过闰秒的???

我自己写了模拟NTP授时的服务端程序,但是处理闰秒(正闰秒)的时候就晕了。

问题:
当闰秒提示来的时候,我就添加一秒,可是我总打印不出 60秒,而是0秒!

正常的时序是 58S 59S 00S
闰秒的时序是 58S 59S 60S 00S

我插入的时序 58S 59S 00S
^60S
打印出来时序 58S 59S 00S (请问出现样的情况原因在哪里啊???


实现的思路:

for(;;)
{
gettimeofday(&tv,0);
time(&t);
tp=gmtime(&t);
printf("In leap_61 %d\n",tp->tm_sec);
/*在59秒快结束时才将增加1秒*/
if(59==tp->tm_sec&& 59==tp->tm_min&&23==tp->tm_hou&&(1e6 - tv.tv_usec)<100)
{
//tv.tv_sec -=1;
//tv.tv_usec=0;
tp=localtime(&t);
tp->tm_sec +=1;//增加1秒,此结构成员范围是0~60
tv.tv_sec=mktime(&tp);//将日历时间转换为秒
tv.tv_usec=0
settimeofday(&tv,0);//设置系统时间
time(&t);//取系统时间
tp=gmtime(&t);//转换时间
/*查看是否设置成功,此处打印出来的秒应该是60秒吧?*/
printf("In leap_61_M %d:%d:%d\n",tp->tm_hour,tp->tm_min,tp->tm_sec);
break;
}
}
...全文
661 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
海底深鱼 2011-11-08
  • 打赏
  • 举报
回复
楼主啊,被你的问题打败了,学习
MayCarry 2011-11-08
  • 打赏
  • 举报
回复
没听过 什么是闰秒啊
codesnail 2011-11-08
  • 打赏
  • 举报
回复
润秒 ,太强大了,我out到火星了。。学习。。。。。。。
赵4老师 2011-11-08
  • 打赏
  • 举报
回复
也许是操作系统或BIOS不支持闰秒。
建议楼主不要钻牛角尖非要实现闰秒了。不如发现当前是闰秒,等几秒后再重新NTP授时。
hefa880 2011-11-08
  • 打赏
  • 举报
回复
难道这个问题没有人会了么???
hefa880 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bokutake 的回复:]

Windows等操作系统的时间设置API是不支持闰秒,虽然新的C对time.h定义允许闰秒,但是操作系统是不支持的。
你只有先把这个mktime返回的time_t,再重新用localtime()把这个time_t打碎成struct tm。这个过程中会把闰秒进位。除此之外没有更好的办法了。反正系统本身是永远到达不了那个60秒的。
[/Quote]
谢谢,对Windows的API了解不多,但是我查了一些资料,上面说2。6。X的内核已经可以支持闰秒
如这文章
http://blog.csdn.net/luckheadline/article/details/3169292

可是我的2.6.27的内核依然没有办法实现
struct tm 是支持闰秒,只是没有办法做到修改系统的时间
想到了一个十分阴险的办法,就是在闰秒提示来的时候,将系统时间调慢1秒时序变成
58s 59s 59s 0s

但 是NTP对闰秒是如何实现的呢?这个越来越感兴趣了,如果有对NTP熟悉的大侠,过来指点下

对知识的欲望是膨胀的~~~
zscedu 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bokutake 的回复:]
Windows等操作系统的时间设置API是不支持闰秒,虽然新的C对time.h定义允许闰秒,但是操作系统是不支持的。
你只有先把这个mktime返回的time_t,再重新用localtime()把这个time_t打碎成struct tm。这个过程中会把闰秒进位。除此之外没有更好的办法了。反正系统本身是永远到达不了那个60秒的。
[/Quote]++
赵4老师 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]
也许是操作系统或BIOS不支持闰秒。
建议楼主不要钻牛角尖非要实现闰秒了。不如发现当前是闰秒,等几秒后再重新NTP授时。
[/Quote]
正解!(^_^)
辰岡墨竹 2011-11-08
  • 打赏
  • 举报
回复
Windows等操作系统的时间设置API是不支持闰秒,虽然新的C对time.h定义允许闰秒,但是操作系统是不支持的。
你只有先把这个mktime返回的time_t,再重新用localtime()把这个time_t打碎成struct tm。这个过程中会把闰秒进位。除此之外没有更好的办法了。反正系统本身是永远到达不了那个60秒的。
hefa880 2011-11-08
  • 打赏
  • 举报
回复
有熟悉NTP的大侠么?NTP是怎么实现闰秒的?????
hefa880 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]

struct tm *localtime(const time_t *timep);

不知道闰秒是60秒的掩面路过。
[/Quote]
你这个tm结构与gmtime的一样吧?只是将内核的时间转换为本地时间,这个支持闰秒?
qq120848369 2011-11-07
  • 打赏
  • 举报
回复
struct tm *localtime(const time_t *timep);

不知道闰秒是60秒的掩面路过。
hefa880 2011-11-07
  • 打赏
  • 举报
回复
我看了gmtime这个函数,说是将time_t t;time(&t)的时间存放在struct tm里面的,而tm_sec是支持闰秒的;
如果gmtime 不支持,请问应该如何实现呢?
赵4老师 2011-11-07
  • 打赏
  • 举报
回复
gmtime或mktime函数不支持闰秒吧。
自信男孩 2011-11-07
  • 打赏
  • 举报
回复
闰秒,,有点寡闻了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧