c++ - 将毫秒 UTC 转换为人类可读的 Date_Time

标签 c++ time boost-date-time

我正在努力弄清楚如何使用 boost::date_time 执行转换。 我想将从 Unix 纪元(1970 年 1 月 1 日 00:00)测量的毫秒值转换为人类可读的字符串 - 类似于:2/13/2012 15:20:11 将是理想。

我已经尝试了一些我见过的标准 C++/boost 建议,但还没有成功。这是我使用的代码:

    long long ticksFromEpoch = 1329117220501;

    std::time_t tt = static_cast<time_t>(ticksFromEpoch);

    boost::posix_time::ptime dt = boost::posix_time::from_time_t(tt);

    // Create a time_zone_ptr for the desired time zone and use it to create a local_date_time
    boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("UTC"));
    boost::local_time::local_date_time dt_with_zone(dt, zone);

    std::stringstream strm;

    strm.imbue(std::locale(std::cout.getloc(), new boost::local_time::local_time_facet("%Y-%m-%d %H:%M:%S"))); // 15:14
    strm << dt_with_zone;

    // Print the stream's content to the console
    std::cout << strm.str() << std::endl;

输出是:2032-07-01 20:20:37 这显然是不正确的。我怀疑我没有正确构建 ticksFromEpoch 变量,但不确定原因。谁能指出我正确的方向?非常感谢任何帮助!!

最佳答案

time_t 通常是自“纪元”以来的秒数,而不是毫秒。 如果您不关心毫秒数,您应该可以这样做:

std::time_t tt = static_cast<time_t>(ticksFromEpoch/1000)

如果你确实关心毫秒,你可以在最后添加它们(这对于像 12:00:00.001 AM 这样的时间来说是很棘手的)

或者你需要走另一条路。您可能需要使用这样的东西:(未经测试)

boost::posix_time::ptime t2(
  boost::gregorian::date(1970,boost::date_time::Jan,1),  //The epoch
  boost::posix_time::seconds( ticksFromEpoch / 1000 ) + // Number of seconds
  boost::posix_time::milliseconds( ticksFromEpoch % 1000)  // And the micros too.
  );

关于c++ - 将毫秒 UTC 转换为人类可读的 Date_Time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9257078/

相关文章:

python - SWIG c++ 到 python : vector problems

java - 如何检查一个时间段是否与java中的另一个时间段重叠

c++ - 使用 Boost datetime 如何创建一个用零填充的月份字符串?

c++ - 使用 Boost::Spirit 解析 time_period 表达式

c++ - 如何将一长串整数作为资源嵌入到 native C++ Windows 应用程序中

c++ - 指针指针方法 C++

c++ - 如何安装 DebugBreak 处理程序?

java - 如何从时区字符串 ID 和纪元实例化 Joda DateTime

swift - 如何快速检查时间是否在特定范围内

关于时间间隔的 C++ 算法