如何从时间戳中提取日期(YYYY-MM-DD)并将其另存为时间戳?
我们知道1518038663000
是Wednesday, 7 February 2018 16:24:23
(GTM -5小时)但我只想保持Wednesday, 7 February 2018
(GTM -5小时)并将其保存为1517979600000
答案 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;这意味着我们在自纪元以来的几毫秒内工作。鉴于此类单位,我们可以将时间戳转换为c++11 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()
。