从 C++ 中的时间戳中提取日期时间戳
Extract date timestamp from a timestamp in C++
如何从时间戳中提取日期 (YYYY-MM-DD) 并将其保存为时间戳?
我们知道 1518038663000
是 Wednesday, 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”,这意味着我们从纪元开始以毫秒为单位工作。给定这样的单位,我们可以将时间戳转换为 c++11's chrono::duration
:const 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()
。
如何从时间戳中提取日期 (YYYY-MM-DD) 并将其保存为时间戳?
我们知道 1518038663000
是 Wednesday, 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”,这意味着我们从纪元开始以毫秒为单位工作。给定这样的单位,我们可以将时间戳转换为 c++11's chrono::duration
:const 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>>
)。
接下来我们需要决定要使用的舍入: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()
。