将时间戳(以毫秒为单位)转换为boost中的时区

时间:2016-07-21 18:35:45

标签: c++ datetime boost

我有一个客户端java库,它使用joda-time库解析带有时区的ISO时间戳,并返回一个long值(UTC中的epoch以来的毫秒数)。我需要开发一个服务器端框架(在C ++中),它将使用自纪元以来的毫秒数并在任何给定时区生成时间戳(例如“Europe / Zurich”)。我可以像这样使用local_date_time选项:

posix_time ptime = epoch(date(1970,1,1)) + ms; //ms sent from client
tz_database tz;
tz.load_from_file(/*path to date_time_zonespec.csv*/);
time_zone_ptr ptr = tz.time_zone_from_region(regionStr); //regionStr = Europe/Zurich
local_date_time mytime(ptime, ptr);

但是,我从这篇文章(C++: Will you choose boost::date_time or icu::date/time library?)中了解到,boost :: date_time时区支持已被破坏。更好的选择是boost :: locale。有没有办法使用boost :: locale执行与上面相同的步骤?我正在使用boost :: Locale在线搜索示例,但找不到任何类似于我想要的示例。

1 个答案:

答案 0 :(得分:2)

也许这free, open-source C++11/14 timezone library可以提供帮助:

#include "tz.h"
#include <iostream>

date::zoned_time<std::chrono::milliseconds>
convert(date::sys_time<std::chrono::milliseconds> tp)
{
    return date::make_zoned(date::locate_zone("Europe/Zurich"), tp);
}

int
main()
{
    using namespace std::chrono;
    std::cout << convert(date::floor<milliseconds>(system_clock::now())) << '\n';
    std::cout << convert(date::sys_time<milliseconds>{1469137715906ms}) << '\n';
}

这只是我的输出:

2016-07-21 23:48:35.906 CEST
2016-07-21 23:48:35.906 CEST

它建立在C ++ 11/14 <chrono>库的基础之上。 std::chrono::system_clock衡量自1970-01-01 UTC以来的时间。时区库有助于使用IANA timezone database将其转换为本地化时区。

Fully documented,易于使用。高性能。在编译时捕获许多错误。

Examples and Recipes.