【问题标题】:Testing for leap seconds for a given time_t in Linux在 Linux 中测试给定 time_t 的闰秒
【发布时间】:2013-07-20 19:27:21
【问题描述】:

是否有一种简单的方法可以确定为给定的实现应用了多少(如果有)闰秒:

time_t unix_seconds = mktime(&my_tm);

例如,my_tm 中是否填充了一个字段?

否则,我想我的选择是测试已知 time_t 值在给定时间与闰秒转换接壤,但如果有更方便的东西会很好。

【问题讨论】:

    标签: posix time-t leap-second


    【解决方案1】:

    您可以将问题简化为找出两个time_t 时间之间有多少闰秒。

    要找到它,您可以计算tatb 两个时间的 tm 结构,并计算自上一小时以来经过的秒数 aTmStruct->tm_min*60 + aTmStruct->tm_sec。 将其存储为 secAsecB

    然后计算tatbdifftime。现在(diff + secB - secA) % 3600 应该给你闰秒的数量,只要它们在tatb 之间的闰秒少于3600 秒。基本上,如果插入闰秒,则 difftime 应该比 secA 和 secB 之间的差值大一。

    【讨论】:

      【解决方案2】:

      您可以循环执行您的实现并计算它所花费的平均时间。

      int i_loop = 0;
      float diff = 0 ;
      struct timeval tv1,tv2;
      struct timezone tz;
      int k = 0;
      N = 128;
      time_t unix_seconds ;
      
      while(true)
      {
        i_loop = (k & N-1);
        if(i_loop= == 0)
         {
      
           gettimeofday(&tv2,&tz);
          //here put your code
           unix_seconds = mktime(&my_tm);
          //end of your code
           diff =  (tv2.tv_sec-tv1.tv_sec) * 1000L ;
           diff = diff/N;
           gettimeofday(&tv1,&tz);
      }
      
        k++;
      }
      

      “diff”是以毫秒为单位的时间

      【讨论】:

      • 强烈反对。这只有在代码在实际闰秒事件期间运行时才可能起作用。即使那样,它也只会告诉我们它是否应用了当前的闰秒。没有用; Linux 内核日志会告诉我们是否遵守闰秒。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2015-11-12
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多