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

Convert timestamp in milliseconds into a timezone in boost

本文关键字:转换 boost 时区 为单位 时间戳      更新时间:2023-10-16

我有一个客户端java库,它使用joda时间库解析带时区的ISO时间戳,并返回一个长值(UTC中自epoch以来的毫秒)。我需要开发一个服务器端框架(C++),它将使用自epoch以来的毫秒,并在任何给定的时区(例如"欧洲/苏黎世")生成时间戳。我可以像这样使用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++:你会选择boost::date_time还是icu::date/time库。更好的选择是boost::locale。有没有一种方法可以使用boost::locale实现与上面相同的步骤?我在网上用boost::Locale搜索示例,但找不到任何与我想要的相似的示例。

也许这个免费的开源C++11/14时区库可以帮助:

#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时区数据库帮助将其转换为本地化时区。

文件齐全,易于使用。高性能。在编译时捕获许多错误。

示例和食谱。