从C ++中的时间戳中提取日期时间戳

时间:2018-02-07 21:27:18

标签: c++ time timestamp unix-timestamp

如何从时间戳中提取日期(YYYY-MM-DD)并将其另存为时间戳?
我们知道1518038663000Wednesday, 7 February 2018 16:24:23(GTM -5小时)但我只想保持Wednesday, 7 February 2018(GTM -5小时)并将其保存为1517979600000

2 个答案:

答案 0 :(得分:1)

如果您愿意使用此free, open-source time zone library,可以这样做:

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

int
main()
{
    using namespace std::chrono;
    using date::operator<<;

    // set up the timestamp
    date::sys_time<milliseconds> ts{1518038663000ms};

    // create a zoned_time by pairing the timestamp with a time_zone
    auto zt = date::make_zoned("America/New_York", ts);

    // confirm what you have by printing out the timestamp and the local time
    std::cout << zt.get_sys_time().time_since_epoch() << '\n';
    std::cout << date::format("%A, %e %B %Y %T (%z)", zt) << "\n\n";

    // Truncate the zoned_time to the beginning of the local day
    zt = date::floor<date::days>(zt.get_local_time());

    // confirm what you have by printing out the timestamp and the local time
    std::cout << zt.get_sys_time().time_since_epoch() << '\n';
    std::cout << date::format("%A, %e %B %Y %T (%z)", zt) << '\n';
}

上面代码中的注释描述了每行代码的作用。中间的单行代码是这个问题的实际答案:

    // Truncate the zoned_time to the beginning of the local day
    zt = date::floor<date::days>(zt.get_local_time());

该程序输出:

1518038663000ms
Wednesday,  7 February 2018 16:24:23.000 (-0500)

1517979600000ms
Wednesday,  7 February 2018 00:00:00.000 (-0500)

答案 1 :(得分:0)

显然随机数字表示时间戳只有在有单位的情况下才有价值。对于号码&#34; 1518038663000&#34;相当于&#34; 2018年2月7日星期三16:24:23&#34;这意味着我们在自纪元以来的几毫秒内工作。鉴于此类单位,我们可以将时间戳转换为 chrono::duration const chrono::milliseconds ts(1518038663000);

chrono::milliseconds我们需要投射到chrono::duration代表天数。不幸的是,最长period的时间库的便利功能是hours,因此我们需要定义我们自己的chrono::duration。由于period定义为:

  

每个刻度的秒数

我们需要计算一天中的秒数unfortunately that's not defined in the standard,但我们可以计算出来:ratio<86400>(或更明确地说:ratio_multiply<chrono::hours::period, ratio<24>>)。

接下来我们需要决定我们要使用的四舍五入:What's the Difference Between floor and duration_cast?但它可能是chrono::floor。所以我们将截断到几天然后转换回毫秒来存储值:

const auto result = chrono::duration_cast<chrono::milliseconds>(chrono::floor<chrono::duration<int, ratio<86400>>>(ts))

至于result的输出格式,您希望使用put_time,这意味着您需要转换如下:

const auto time = chrono::system_clock::to_time_t(chrono::system_clock::time_point(result));

cout << put_time(localtime(&time), "%A,%e %B %Y");

您要存储的时间戳为:result.count()

Live Example