- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要将 std::chrono::time_point
与 long
类型(64 位整数)相互转换。我开始使用 std::chrono
...
这是我的代码:
int main ()
{
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
auto epoch = now.time_since_epoch();
auto value = std::chrono::duration_cast<std::chrono::milliseconds>(epoch);
long duration = value.count();
std::chrono::duration<long> dur(duration);
std::chrono::time_point<std::chrono::system_clock> dt(dur);
if (dt != now)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
}
此代码编译,但未显示成功。
为什么最后的dt
与now
不同?
该代码缺少什么?
最佳答案
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
这是auto
的好地方:
auto now = std::chrono::system_clock::now();
由于您希望以 毫秒
精度进行流量,因此最好继续并在 time_point
中进行转换:
auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
now_ms
是一个 time_point
,基于 system_clock
,但精度为 milliseconds
而不是任何精度你的 system_clock
有。
auto epoch = now_ms.time_since_epoch();
epoch
现在具有类型 std::chrono::milliseconds
。下一条语句本质上变成了无操作(只是复制而不进行转换):
auto value = std::chrono::duration_cast<std::chrono::milliseconds>(epoch);
这里:
long duration = value.count();
在您和我的代码中,duration
保存自 system_clock
的纪元以来的 毫秒
数。
这个:
std::chrono::duration<long> dur(duration);
创建一个用 long
表示的 duration
,精度为 seconds
。这有效地 reinterpret_cast
将 value
中保存的 milliseconds
转换为 seconds
。这是一个逻辑错误。正确的代码如下所示:
std::chrono::milliseconds dur(duration);
这一行:
std::chrono::time_point<std::chrono::system_clock> dt(dur);
基于 system_clock
创建一个 time_point
,能够将精度保持在 system_clock
的 native 精度(通常小于毫秒) )。但是,运行时值将正确反射(reflect)整数毫秒数(假设我更正了 dur
的类型)。
即使进行了更正,该测试也会(几乎总是)失败:
if (dt != now)
因为 dt
拥有整数个 milliseconds
,而 now
拥有比 millisecond
更精细的整数个刻度code>(例如 microseconds
或 nanoseconds
)。因此,只有在 system_clock::now()
返回整数 milliseconds
的极少数情况下,测试才会通过。
但你可以:
if (dt != now_ms)
现在您将可靠地获得预期结果。
把它们放在一起:
int main ()
{
auto now = std::chrono::system_clock::now();
auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
auto value = now_ms.time_since_epoch();
long duration = value.count();
std::chrono::milliseconds dur(duration);
std::chrono::time_point<std::chrono::system_clock> dt(dur);
if (dt != now_ms)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
}
我个人觉得所有 std::chrono
过于冗长,所以我将其编码为:
int main ()
{
using namespace std::chrono;
auto now = system_clock::now();
auto now_ms = time_point_cast<milliseconds>(now);
auto value = now_ms.time_since_epoch();
long duration = value.count();
milliseconds dur(duration);
time_point<system_clock> dt(dur);
if (dt != now_ms)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
}
哪个会可靠输出:
Success.
最后,我建议消除临时变量,以将 time_point
和整数类型之间的代码转换减少到最低限度。这些转换是危险的,因此您编写的操作裸整数类型的代码越少越好:
int main ()
{
using namespace std::chrono;
// Get current time with precision of milliseconds
auto now = time_point_cast<milliseconds>(system_clock::now());
// sys_milliseconds is type time_point<system_clock, milliseconds>
using sys_milliseconds = decltype(now);
// Convert time_point to signed integral type
auto integral_duration = now.time_since_epoch().count();
// Convert signed integral type to time_point
sys_milliseconds dt{milliseconds{integral_duration}};
// test
if (dt != now)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
}
上面的主要危险是不在返回 time_point
的路上将 integral_duration
解释为 milliseconds
。减轻这种风险的一种可能方法是编写:
sys_milliseconds dt{sys_milliseconds::duration{integral_duration}};
这将风险降低到只需确保您在退出时使用 sys_milliseconds
并在返回途中的两个地方使用。
还有一个例子:假设您要转换为表示 system_clock
支持的任何持续时间的积分(微秒,10th 微秒或纳秒)。然后您不必担心如上所述指定毫秒。代码简化为:
int main ()
{
using namespace std::chrono;
// Get current time with native precision
auto now = system_clock::now();
// Convert time_point to signed integral type
auto integral_duration = now.time_since_epoch().count();
// Convert signed integral type to time_point
system_clock::time_point dt{system_clock::duration{integral_duration}};
// test
if (dt != now)
std::cout << "Failure." << std::endl;
else
std::cout << "Success." << std::endl;
}
这是可行的,但是如果您在一个平台上运行一半的转换(从积分转换),而在另一个平台上运行另一半转换(从积分转换),您将面临 system_clock::duration
的风险两次转换会有不同的精度。
关于c++ - 如何将 std::chrono::time_point 转换为 long 并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255486/
boost::chrono::steady_clock::time_point 之间有什么区别?和 boost::chrono::time_point ,为什么不能相互转换? 这似乎非常多余。 最佳答
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
我有一个变量存储为 long 来自 std::chrono::system_clock::time_point.time_since_epoch().count() 的值。我现在想从 long 变量中
如何将计时持续时间转换为时间点,该时间点晚于具有给定持续时间的时钟纪元?我试图在计时时钟中找到纪元时间,但没有成功。 最佳答案 来自 20.12.6 [time.point] 的概要: templat
我有一个用户提供的持续时间 const int period_seconds = cfg.period_seconds; 我想floor一个time_point到那个duration的粒度。 我看到
我有一个用户提供的持续时间 const int period_seconds = cfg.period_seconds; 我想floor一个time_point到那个duration的粒度。 我看到
给定两个分割值,自纪元以来的秒数和 µs,以下哪个更可取? auto timestamp = system_clock::time_point(seconds(time_seconds) + micr
我将 time_point 设置为下一个完整的五分钟,这很容易: template using minutes = std::chrono::duration, std::chrono::m
简单的问题,如何使用尽可能少的代码将 std::chrono::time_point 正确转换为 std::string? 注意:我不想将 cout 与 put_time() 一起使用。接受 C++1
我正在开发一个类 Timer它的一些成员属于 high_resolution_clock::time_point 类型其中 time_point定义为 typedef chrono::time_poi
我发现了以下问题。我有一个带时间的字符串(从我使用反向操作输出的文件中获取)。但是,当将其转换为 time_point 并将其输出到终端时,我发现相差一小时。我一直无法找出原因。有什么想法吗? #in
我不明白为什么这段代码会被 g++ 4.7.2 卡住: #include main () { std::chrono::system_clock::time_point t1, t2 ;
如果我有一个 std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now(); 变量,我如何定义另一个 time
我正在转换 std::chrono::time_point使用 的时间戳 std::chrono::duration_cast( getTimestamp().time_since_epoch()
如何仅更改现有 std::chrono::system_clock::time_point 的小时? 例如,假设我想实现这个功能: void set_hour(std::chrono::system_
如何仅更改现有 std::chrono::system_clock::time_point 的小时? 例如,假设我想实现这个功能: void set_hour(std::chrono::system_
如何从 std::chrono::system_clock::time_point 设置平台(windows、linux、android)的系统时间。 最佳答案 您不能使用 std::chrono 工
我在 12 天前发布了关于将 std::chrono::time_point 转换为字符串的问题并解决了问题。我想对你说声谢谢。 我使用以下代码解决了我的问题: char no[15]; string
我需要在 C++ 中获取当前日期和时间。我可以使用 chrono 来获取 系统时间 但我还需要将其作为字符串保存在 json 文件中。此外,我尝试过的计时时间格式如下: auto time = std
我对这些库还是很陌生,我可以在 std::chrono 上找到的文档对我不起作用。 我正在尝试实现一个包含时间戳的对象容器。这些对象都将按从最近到最不最近的顺序存储,我决定尝试使用 std::chro
我是一名优秀的程序员,十分优秀!