首页 > 解决方案 > 如何使用闰秒以微秒为单位获取 UTC 时间

问题描述

如何在调整闰秒的情况下以微秒为单位获得 UTC 时间?我在用boost::universal_clock()

 boost::posix_time::time_duration utc_time =
      boost::posix_time::microsec_clock::universal_time() -
      boost::posix_time::from_time_t(0);
  int64_t total_microsec = utc_time.total_microseconds(); 

但是这个结果是一样的

std::chrono::time_point_cast<std::chrono::duration<int64_t, std::microseconds>>(
             std::chrono::system_clock::now())
      .time_since_epoch()
      .count();

似乎 boost 没有调整闰秒。但是,当我使用 C 时,gmtime()我会得到不同的结果:

  time_t mytime;

  struct tm *ptm;

  time(&mytime);  // Get local time in time_t

  ptm = gmtime(&mytime);  // Find out UTC time

  time_t utctime = mktime(ptm);  // Get UTC time as time_t

如何使用 boost 库来实现它?

标签: c++boost

解决方案


使用Howard Hinnant 的日期/时间库非常简单:

#include "date/tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;
    auto now = floor<microseconds>(utc_clock::now());
    cout << now << '\n';
    cout << now.time_since_epoch() << '\n';
    cout << clock_cast<system_clock>(now).time_since_epoch() << '\n';
}

这是对 的C++20 新增<chrono>功能的预览,但在namespace date.

utc_clock计算自 1970-01-01 00:00:00 UTC 以来的时间,包括闰秒。出于比较目的,将从此时钟转换回时钟clock_casttime_pointsystem_clock

这个程序只是为我输出:

2019-08-10 00:19:04.388788
1565396371388788µs
1565396344388788µs

需要一些安装。


推荐阅读