【问题标题】:Most elegant way to combine chrono::time_point from hours, minutes, seconds etc从小时、分钟、秒等中组合 chrono::time_point 的最优雅方式
【发布时间】:2015-07-08 06:25:14
【问题描述】:

我有一个“人类可读”变量hoursminutessecondsdaymonthyear,其中包含与其名称相对应的值(让我们假设我有来自<windows.h>SYSTEMTIME 结构。
我发现创建chrono::time_point 的唯一方法是:

SYSTEMTIME sysTime = ...; // Came from some source (file, network, etc. )
tm t;
t.tm_sec = sysTime.wSecond;
t.tm_min = sysTime.wMinute;
t.tm_hour = sysTime.wHour;
t.tm_mday = sysTime.wDay;
t.tm_mon = sysTime.wMonth - 1;
t.tm_year = sysTime.wYear - 1900;
t.tm_isdst = 0;
std::chrono::system_clock::time_point dateTime =
    std::chrono::system_clock::from_time_t( mktime( & t ) );

首先,我从SYSTEMTIME 损失了一毫秒。
其次,(嗯...)我不喜欢这种转换))

你能给出一个更优雅的方式来解决这个问题吗?

【问题讨论】:

  • 如果您有实际 SYSTEMTIME,请参阅SystemTimeToFileTime()
  • @MSalters SystemTimeToFileTime() 给了我自 1601 年 1 月 1 日以来的 100 纳秒间隔,但我需要 chrono::time_point
  • 是的。但这稍微简化了数学。获取 1-1-2000 的 FILETIME 和 chrono::time_point(以防止超出范围的问题 - 您可以执行一次),从当前时间中减去该 FILETIME,乘以 10 得到微秒,然后将这些微秒添加到 1 -1-2000 时间点

标签: c++ c++11 chrono


【解决方案1】:

使用this open source, header-only library,我可以:

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

struct SYSTEMTIME
{
    int wMilliseconds;
    int wSecond;
    int wMinute;
    int wHour;
    int wDay;
    int wMonth;
    int wYear;
};

int
main()
{
    SYSTEMTIME sysTime = {123, 38, 9, 10, 8, 7, 2015};
    std::chrono::system_clock::time_point dateTime =
        date::sys_days(date::year(sysTime.wYear)
                      /date::month(sysTime.wMonth)
                      /date::day(sysTime.wDay))
        + std::chrono::hours(sysTime.wHour)
        + std::chrono::minutes(sysTime.wMinute)
        + std::chrono::seconds(sysTime.wSecond)
        + std::chrono::milliseconds(sysTime.wMilliseconds);
    std::cout << dateTime << '\n';
}

哪个输出:

2015-07-08 10:09:38.123000

在 "date.h" 中,您可能需要使用这些宏才能使用 VS 进行编译。:

#  define CONSTDATA const
#  define CONSTCD11 
#  define CONSTCD14

使用符合标准的 C++14 编译器,这些宏应设置为:

#  define CONSTDATA constexpr
#  define CONSTCD11 constexpr 
#  define CONSTCD14 constexpr

【讨论】:

  • 没有内置网络支持的语言中的仅标头库如何处理闰秒,其存在在数学上是不可预测的?如果没有,你如何处理闰秒?
  • @Yakk:这个库不支持闰秒。但是,我几乎完成了另一个库,该库位于该库之上,它确实处理闰秒。这个其他库不是仅标头,而是 IANA 时区数据库的完整解析器:iana.org/time-zones IANA 数据库在其数据中包含闰秒。这个较新的库功能完整,但尚未记录。
  • 伟大的(est)图书馆。谢谢你。您能否从答案中删除 using namespace 并将它们带回所有符号以查看哪些符号来自您的库以及哪些符号来自 chrono ?多谢各位
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多