微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C++11 中保存时间戳 返回值

如何解决在 C++11 中保存时间戳 返回值

我试图在运行开始时获取时间戳,在运行结束时获取一个时间戳,并在运行结束时打印两者。但是,显然两个时间戳是相同的:结束的时间戳。这是我的代码

#include <iostream>
#include <chrono>
#include <thread>

int main(){
   std::time_t Now = std::time(nullptr);
   char * t_start,* t_end;
   t_start = std::asctime(std::localtime(&Now));
    
   std::this_thread::sleep_for(std::chrono::nanoseconds(5000000000));

   Now = std::time(nullptr);
   t_end = std::asctime(std::localtime(&Now));

   std::cout<<"Started at "<<t_start<<std::endl;       
   std::cout<<"Ended at "<<t_end<<std::endl;   
return 0;   
}

输出是什么

Started at Thu Jan 21 09:54:32 2021
Ended at Thu Jan 21 09:54:32 2021

即使两个时间戳之间有 5 秒的延迟。我相信这个问题与指向同一个获取时间”对象的指针有关,所以我的问题是如何保存开始时间 t_start 以便我以后可以打印它?在开头打印 t_start 给出了正确的时间戳,但是,我在最后需要它们。

解决方法

看看asctime()

返回值

指向静态空终止字符串的指针,该字符串包含 日期和时间的文本表示。字符串可以共享 在 std::asctime 和 std::ctime 之间,并且可以在每个 调用任何这些函数。

您打印了两次相同的字符串。要更正它,您需要为每个字符串创建一个新的缓冲区。

或者,您可以等待格式化您的时间,直到您需要打印它:

#include <iostream>
#include <chrono>
#include <thread>

int main()
{
    std::time_t t_start = std::time(nullptr);

    std::this_thread::sleep_for(std::chrono::seconds(5));

    std::time_t t_end = std::time(nullptr);

    std::cout << "Started at "
            << std::asctime(std::localtime(&t_start))
            << std::endl;
    std::cout << "Ended at "
            << std::asctime(std::localtime(&t_end))
            << std::endl;
    return 0;
}

结果:

Started at Thu Jan 21 09:12:45 2021

Ended at Thu Jan 21 09:12:50 2021
,

这是一个很好的例子,隐藏状态(全局变量)有多糟糕。

std::asctime - cppreference.com

返回值

指向包含日期和时间文本表示的静态空终止字符串的指针。该字符串可以在 std::asctimestd::ctime 之间共享,并且可以在每次调用这些函数时被覆盖。

基本上 std::asctime 总是返回相同的指针,但更新其本地静态缓冲区。

所以要修复它,您不能保留指针以备后用。

这是固定版本:https://godbolt.org/z/r491W7

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。