将毫秒UTC转换为人类可读日期_时间

Pat*_*ard 2 c++ time boost-date-time

我正在努力弄清楚如何使用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;
Run Code Online (Sandbox Code Playgroud)

输出是:2032-07-01 20:20:37这显然不正确.我怀疑我没有ticksFromEpoch正确构造变量,但我不确定为什么.谁能指出我正确的方向?任何帮助深表感谢!!

Mic*_*son 5

time_t通常是"纪元"以来的秒,而不是毫秒.如果你不关心毫秒,你应该能够做到这一点:

std::time_t tt = static_cast<time_t>(ticksFromEpoch/1000)
Run Code Online (Sandbox Code Playgroud)

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

或者你需要走另一条路.您可能需要使用以下内容:(未经测试)

boost::posix_time::ptime t2(
  date(1970,Jan,1),  //The epoch
  boost::posix_time::seconds( ticksFromEpoch / 1000 ) + // Number of seconds
  boost::posix_time::microseconds( ticksFromEpoch % 1000)  // And the micros too.
  );
Run Code Online (Sandbox Code Playgroud)

  • @Frank,你的刻度必须是UTC刻度(这对于posix时间是正确的).使用此处的时区功能切换到本地时间:http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/local_time.html (2认同)