【问题标题】:Converting millisecond UTC to Human Readable Date_Time将毫秒 UTC 转换为人类可读的 Date_Time
【发布时间】:2012-02-13 07:47:04
【问题描述】:

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

我已经尝试了一些我见过的 std 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 变量,但我不知道为什么。谁能指出我正确的方向?非常感谢任何帮助!

【问题讨论】:

标签: c++ time boost-date-time


【解决方案1】:

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.
  );

【讨论】:

  • 感谢您的快速回复,迈克尔!你最初的观察奏效了。几乎。 std::time_t tt = static_cast&lt;time_t&gt;(ticksFromEpoch/1000); 但结果似乎仍然比我的语言环境晚 8 小时。
  • @Frank,那么您的刻度必须是 UTC 刻度(这对于 posix 时间是正确的)。使用此处的时区功能切换到本地时间:boost.org/doc/libs/1_48_0/doc/html/date_time/local_time.html
  • 再次感谢您的意见!也许我没有正确理解文档,但似乎我需要使用"MST-07" 之类的东西明确指定时区,而我正在寻找能够动态推断其所处时区的东西,因为我的系统将在许多不同的环境中运行时区。
  • 为了动态推断时区,我必须使用以下 C 代码:time_t now = time(NULL); struct tm tnow = *localtime(&amp;now);//gmtime(&amp;now); char buff[100]; strftime( buff, sizeof buff, "%a %b %d %Y %T %Z%z", &amp;tnow ); printf( "&gt;&gt;%s&lt;&lt;\n", buff );,它确实获得了所需的系统时区。干杯...
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
相关资源
最近更新 更多