哪些库可以正确计数秒数,哪些日期可以正确计数



例如,计算"2021-01-01 12:56:23.423 UTC"one_answers"2001-01-01 00:00:00.000 UTC"之间的SI秒数。

C++20可以使用以下语法来实现:

#include <chrono>
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
auto t0 = sys_days{2001y/1/1};
auto t1 = sys_days{2021y/1/1} + 12h + 56min + 23s + 423ms;
auto u0 = clock_cast<utc_clock>(t0);
auto u1 = clock_cast<utc_clock>(t1);
cout << u1 - u0 << 'n';  // with leap seconds
cout << t1 - t0 << 'n';  // without leap seconds
}

该输出:

631198588423ms
631198583423ms

第一个数字包括闰秒,比不包括闰秒的第二个数字大5s。

这个C++20计时预览库可以在C++11/14/17中完成。一个只需要#include "date/tz.h",在两个位置将y后缀更改为_y,然后添加using namespace date;

我的库Time4J可以用Java语言实现这项任务。使用输入的示例:

ChronoFormatter<Moment> f = 
ChronoFormatter.ofMomentPattern(
"uuuu-MM-dd HH:mm:ss.SSS z", 
PatternType.CLDR, 
Locale.ROOT, 
ZonalOffset.UTC);
Moment m1 = f.parse("2001-01-01 00:00:00.000 UTC");
Moment m2 = f.parse("2021-01-01 12:56:23.423 UTC");

MachineTime<TimeUnit> durationPOSIX = MachineTime.ON_POSIX_SCALE.between(m1, m2);
MachineTime<SI> durationSI = MachineTime.ON_UTC_SCALE.between(m1, m2);
System.out.println("POSIX: " + durationPOSIX); // without leap seconds
// output: 631198583.423000000s [POSIX]
System.out.println("SI: " + durationSI); // inclusive 5 leap seconds
// output: 631198588.423000000s [UTC]

// if you only want to count full seconds...
System.out.println(SI.SECONDS.between(m1, m2)); 
// output: 631198588
// first leap second after 2001
System.out.println(m1.with(Moment.nextLeapSecond()));
// output: 2005-12-31T23:59:60Z

5秒差距的结果与2001年至2021年官方列出的闰秒一致。

一般来说:此库自1972年以来仅支持闰秒。

相关内容

  • 没有找到相关文章

最新更新