gpt4 book ai didi

c++ - 将人类可读的日期转换为毫秒并在不丢失信息的情况下再次返回

转载 作者:太空狗 更新时间:2023-10-29 20:22:40 26 4
gpt4 key购买 nike

我在我的程序中加入了人类可读的时间戳。我想将它们存储在数据库中并以不同的方式使用它们。我更愿意将它们表示为 long int,因为这样更容易、更高效,但能够在便于机器阅读的内容和便于人类阅读的内容之间切换也很方便。

我编写了以下测试程序,包括将人类可读时间戳与长整数相互转换的函数。

// g++ -o timetest timetest.cpp -std=c++11

#include <iostream>
#include <sstream>

#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>

long millis_from_date(const std::string& s)
{
boost::posix_time::ptime pt;
std::istringstream is(s);
auto* f = new boost::posix_time::time_input_facet("%Y-%m-%dT%H:%M:%S.%FZ");
std::locale loc(std::locale(""), f);
is.imbue(loc);
is >> pt;
boost::posix_time::ptime timet_start(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration diff = pt - timet_start;
return diff.total_milliseconds();
}

std::string date_from_millis(long ms)
{
static const boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
boost::posix_time::time_facet * facet = new boost::posix_time::time_facet("%Y-%m-%dT%H:%M:%S.%fZ");
std::ostringstream stream;
stream.imbue(std::locale(stream.getloc(), facet));
stream << epoch + boost::posix_time::milliseconds(ms);;
return stream.str();
}

int main()
{
std::string time = "2016-04-14T07:47:50.120043Z";

std::cout << "Initial input: " << time << std::endl;
std::cout << std::endl;

{
long millis = millis_from_date(time);
std::cout << "Initial input in millis: " << millis << std::endl;

std::string newtime = date_from_millis(millis);
std::cout << "Converted back to date: " << newtime << std::endl;
}

{
long millis = millis_from_date(time);
std::cout << "Initial input in millis: " << millis << std::endl;

std::string newtime = date_from_millis(millis);
std::cout << "Converted back to date: " << newtime << std::endl;
}

return 0;
}

这是示例输出。

Initial input:           2016-04-14T07:47:50.120043Z

Initial input in millis: 1460620070000
Converted back to date: 2016-04-14T07:47:50.000000Z
Initial input in millis: 1460620070000
Converted back to date: 2016-04-14T07:47:50.000000Z

如您所见,当转换为毫秒时,小数秒信息会丢失,因此您得到的是自纪元开始以来的秒数,末尾附加了 000。因此,当将结果 long 转换回人类可读的时间戳时,小数秒信息会丢失。

我现在已经尝试了很多东西,但我无法弄清楚 millis_from_date 函数在不丢失小数秒信息的情况下应该如何工作。有什么想法吗??

最佳答案

删除 %F 之前的句点,它起作用了。请参阅此处的示例:http://www.boost.org/doc/libs/1_60_0/doc/html/date_time/date_time_io.html#time_input_facet_accessors

另请注意,毫秒不足以存储示例 2016-04-14T07:47:50.120043Z 中的全部精度。由于您有 6 位十进制数字,因此您需要微秒。

另请注意,自 01-Jan-1970 以来有大量微秒负载,因此 long 是不够的。而且无论如何使用 long 都不是一个好主意,因为这种类型在不同的平台上可能有不同的大小。一个更好的主意是为此目的使用 uint64_t,这就是 boost 用来存储持续时间的方法。在 64 位的帮助下,您将能够将微秒存储另外 50 万年左右。

关于c++ - 将人类可读的日期转换为毫秒并在不丢失信息的情况下再次返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36825153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com