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

Extract date timestamp from a timestamp in C++

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

如果你愿意使用这个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)

显然被称为时间戳的随机数只有在它们也有单位的情况下才有价值。对于等于 "Wednesday, 7 February 2018 16:24:23" 的数字“1518038663000”,这意味着我们从纪元开始以毫秒为单位工作。给定这样的单位,我们可以将时间戳转换为 's chrono::durationconst chrono::milliseconds ts(1518038663000);

chrono::milliseconds 开始,我们需要转换为代表天数的 chrono::duration。不幸的是,具有最长 period 的 chrono 库的便捷函数是 hours,因此我们需要定义我们自己的 chrono::duration。由于 period 定义为:

The number of seconds per tick

我们需要计算一天的秒数,,但我们可以计算它:ratio<86400>(或者更明确地说:ratio_multiply<chrono::hours::period, ratio<24>>)。

接下来我们需要决定要使用的舍入: But it's probably 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