2012-02-13 66 views
2

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

我已经尝试了一些我见过的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变量,但我不知道为什么。任何人都可以将我指向正确的方向吗?任何帮助深表感谢!!

+1

推进方案[1] [1]:http://stackoverflow.com/questions/8916071 /转换日期时间到不同时区在C升压/ 9274998#9274998 – 2012-02-14 23:27:00

回答

5

time_t通常是自“新纪元”以来的秒数,而不是毫秒。 如果你不约毫秒照顾,你应该能够做到这一点:

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

如果你做一下毫秒照顾,你可以将它们添加回在结束时(这是棘手得到正确的时间像12: 00:00.001 AM)

或者你需要走另一条路线。您可能需要使用这样的事情:(未经测试)公布[这里]为Windows和POSIX

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

感谢您的快速反应,迈克尔!你的初步观察工作。几乎。 'std :: time_t tt = static_cast (ticksFromEpoch/1000);' 但结果仍然是我的区域设置后面8小时。 – 2012-02-13 08:42:47

+2

@Frank,你的刻度必须是UTC刻度然后(posix时间是正确的)。使用此处找到的时区功能切换到本地时间:http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/local_time.html – 2012-02-13 09:01:03

+0

再次感谢您的意见!也许我不正确地理解文档,但似乎我需要明确地指定时区,例如“MST-07”',而我正在寻找某些可以在我的系统运行时动态生成时区的东西许多不同的时区。 – 2012-02-13 09:30:11