用时间戳格式化亚秒精度时间

Boost - Formatting sub second precision time with a time stamp

本文关键字:精度 时间 时间戳 格式化      更新时间:2023-10-16

我需要得到一个精确到毫秒的格式化时间戳(稍作修改的ISO 8601)。

示例日期看起来像这样:2011-09-28 13:11:15.237-08:00
格式也应该能够被覆盖。

我一直在玩boost::posix_time::microsec_clock::local_time()boost::posix_time::time_facet,它工作得很好,除了时间戳。
由于posix time不包含时区信息,这是不可能的(我猜)

那么,还有什么我可以使用的,具有毫秒精度,包含时区信息,或者我可以使time_facet工作与时区?

也许我应该一直使用UTC?

谢谢

看一下boost::local_time::local_date_time类。您可以指定一个时区,并使用本地微秒时钟对其进行初始化,如

boost::local_time::local_date_time  my_ldt(boost::local_time::local_microsec_clock::local_time(new boost::local_time::posix_time_zone("EST-5EDT,M4.1.0,M10.5.0")));

你应该可以使用facet来格式化为字符串。

编辑:完整示例:

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <boost/date_time/local_time/local_time.hpp>
int main(void)
{
    boost::posix_time::ptime  now = boost::posix_time::second_clock::local_time();
    boost::posix_time::ptime  utc = boost::posix_time::second_clock::universal_time();
    boost::posix_time::time_duration tz_offset = (now - utc);
    std::stringstream   ss;
    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet();
    ss.imbue(std::locale(std::locale::classic(), output_facet));
    output_facet->format("%H:%M:%S");
    ss.str("");
    ss << tz_offset;
    boost::local_time::time_zone_ptr    zone(new boost::local_time::posix_time_zone(ss.str().c_str()));
    boost::local_time::local_date_time  ldt = boost::local_time::local_microsec_clock::local_time(zone);
    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet();
    ss.imbue(std::locale(std::locale::classic(), output_facet));
    output_facet->format("%Y-%m-%d %H:%M:%S%f%Q");
    ss.str("");
    ss << ldt;
    std::cout << ss.str() << std::endl; // "2004-02-29 12:34:56.000789-05:00"
    std::cout << "Press return to exit" << std::endl;
    std::string wait_for_line;
    std::getline(std::cin, wait_for_line);
    return (0);
}