- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
C 标准 (ISO/IEC 9899) 规定:
7.2x.2.2 The
difftime
functionSynopsis
#include <time.h>
double difftime(time_t time1, time_t time0);Description
The
difftime
function computes the difference between two calendar times:time1 - time0
.Returns
The
difftime
function returns the difference expressed in seconds as adouble
.
如果结果说明 leap seconds 或不说明,这会使其变得模棱两可(我猜是故意的)。差异(从 1970 年到 2015 年 7 月比较时为 26 秒)在某些应用程序中很重要。
C 标准库的大多数实现不考虑闰秒,这是可测试的:以下(故意简洁)代码倾向于输出 leap seconds accounted from 2000/01/01 to 2015/01/01: 0
(如果 mktime
无效,则为 -473385600
),在此期间确实有 3 个闰秒。
#include <time.h>
#include <stdio.h>
struct tm t0,t1; // globals, thus initialized to zero
int main(void) {
t0.tm_year = 2000-1900; // from 2000
t1.tm_year = 2015-1900; // to 2015
t0.tm_mday = t1.tm_mday = 1; // first day of January
printf("leap seconds accounted for from 2000/01/01 to 2015/01/01: %.0f\n",
difftime( mktime(&t1), mktime(&t0) ) - 86400.*(365.*15+4) );
return 0;
}
是否存在带有计算闰秒的 C/C++ 标准库的实际系统,可以使用 mktime
和 difftime
的这种组合进行测试?
换句话说:许多现代操作系统都通过更新机制了解有关法定时间的立法变更,并且像 localtime
这样的标准库函数确实使用该信息并相应地计算它们的结果。完全有可能,并且据我所知符合 C 标准,类似的更新机制会通知操作系统过去和不久的将来的闰秒,并且 difftime
或 mktime
使用该信息。我的问题是周围是否有这样的系统和标准库,因为这会影响某些代码。
以下 comment :上下文是应该可移植到各种系统(从嵌入式到大型机,有些很旧)的代码,并决定何时(从调用时间开始的秒数,最多为 99999 的整数)一些必须根据(除了系统时间之外)给定的“自 2000 年 1 月 1 日以来在 UTC 午夜经过的秒数”和所需的操作时间来触发操作。 ±2 秒的误差(加上 UTC 引用的漂移)是可以容忍的。
现有代码使用 time
、mktime
表示 2000/01/01 和 difftime
表示它们之间的差异,如下所示通过减去给定的。我想知道是否严重担心它可能会失败(并返回一些略微超出规定容差的东西;比如 4 在撰写本文时太低,并且还在增加)。我不是询问如何使代码可移植(一个选项是使用 gmtime(time(NULL))
并使用显式代码计算其余部分)。
主要问题的措辞没有time
,以避免time
是否考虑时区的不同可移植性问题。
最佳答案
这是一个信息问题,但实际上是一个物理问题。
通用操作系统,了解 UTC 时间,最终了解本地时间。他们假设引用是 UTC 时间并且所有分钟都恰好持续 60 秒。他们使用闰秒来补偿本地时间源( quartz )和外部引用之间的误差。从他们的角度来看,滑动时钟的校正与真正的(物理)闰秒没有区别。出于这个原因,他们不知道 true 闰秒,目前忽略它们
1955年,铯原子钟发明。这提供了一种比天文观测更稳定、更方便的计时方式。
[1972 年,TAI(法语 Temps Atomique International)被定义,仅基于铯原子钟。]在 1970 年代,很明显参与 TAI 的时钟由于引力时间而以不同的速率滴答作响膨胀,因此组合的 TAI 标度对应于各种时钟高度的平均值。从 Julian Date 2443144.5(1977 年 1 月 1 日 00:00:00)开始,对所有参与时钟的输出应用了更正,以便 TAI 对应于平均海平面(大地水准面)的本征时间。因为时钟平均高于海平面,这意味着 TAI 放慢了大约万亿分之一。由于潮汐减速,地球的自转速度正在非常缓慢地下降;这增加了平均太阳日的长度。 SI 秒的长度是根据星历时间的秒数校准的,现在可以看出它与 Simon Newcomb 分析的 1750 年至 1892 年间观察到的平均太阳日有关系。因此,SI 秒接近 19 世纪中叶平均太阳日的 1/86400。在更早的几个世纪,平均太阳日短于 86,400 SI 秒,而在最近几个世纪,它长于 86,400 秒。接近 20 世纪末,平均太阳日的长度(也简称为“日长”或“LOD”)约为 86,400.0013 秒。出于这个原因,UT 现在比 TAI“慢”了 1.3 毫秒/天的差异(或“过量”LOD)。
第一个闰秒出现在 1972 年 6 月 30 日。从那时起,闰秒平均每 19 个月出现一次,总是在 6 月 30 日或 12 月 31 日。截至 2015 年 7 月,总共有 26 个闰秒,均为正,使 UTC 落后 TAI 36 秒。
TL/DR 因此,如果您真的需要它,您将必须获取在(物理)UTC 中引入 26 闰秒的日期,并在相关时手动获取它们。据我所知,目前的操作系统和标准库都没有处理它们。
闰秒引入日期表在 http://www.ietf.org/timezones/data/leap-seconds.list 以纯文本形式维护。
关于c++ - 是否存在 difftime 计算闰秒的实际系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31313157/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!