gpt4 book ai didi

c++ - 将 boost ptime 从本地时间转换为 UTC

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:17 24 4
gpt4 key购买 nike

我有一个 boost::posix_time::ptime 对象 (Boost v1.60),它包含系统时区中的日期和时间信息。我需要将其转换为 UTC 格式的 unix 时间戳。

time_t convertLocalPtimeToTimestamp(const boost::posix_time::ptime& pt)
{
using namespace boost::local_time;
static const time_t t_null = 0;
static struct tm* tm_local = localtime(&t_null);
static time_zone_ptr zone(new posix_time_zone(tm_local->tm_zone));
LOG(debug) << "Zone " << zone->to_posix_string();

local_date_time az(pt.date(), pt.time_of_day(), zone, local_date_time::EXCEPTION_ON_ERROR);
LOG(debug) << "local_date_time: " << az;
LOG(debug) << "local_time: " << az.local_time();
LOG(debug) << "utc_time: " << az.utc_time();
struct tm t = to_tm(az);
time_t ts = mktime(&t);

return ts;
}

我的案例(欧洲/马德里)的结果是:

Zone CET+00
local_date_time: 2016-Oct-05 17:36:27.701162 CET
local_time: 2016-Oct-05 17:36:27.701162
utc_time: 2016-Oct-05 17:36:27.701162
1475685387

这个结果有各种错误:

  • 应将时区检测为夏令时:CEST (+0200) 而不是 CET (+0100)
  • 即使没有 DST 检测,utc_time 也应该与 local_time 不同。
  • 最后,时间戳应代表 UTC 时间,而不是本地时间。

如有任何帮助,我们将不胜感激。

最佳答案

这是我要解决的问题的 Boost 实现。

我不想使用另一个第三方库,我在 Windows 中遇到了 jgaida 的回答问题(tm_zone 和 tm_gmtoff 不是 tm 的成员)。

我通过多次更改 Windows 10 PC 中的时区来测试此代码。

边缘案例“(UTC-12:00) International Date Line West”和“(UTC+14:00) Kiritimati Island)”也进行了测试,结果成功。

time_t convertLocalPtimeToTimestamp (const boost::posix_time::ptime& pt)
{
using namespace boost::posix_time;
using namespace boost::local_time;

_tzset (); // This is needed if the time zone changes after the program starts.

// Grab copies of the current time in local and UTC form.
auto p_time = microsec_clock::universal_time (); // UTC.
auto lp_time = boost::date_time::c_local_adjustor<ptime>::utc_to_local (p_time);

// Calculate the difference between the UTC and local time and put it in a string.
// This will yield "-07:00:00" for PST and "-08:00:00" for PDT.
auto time_diff = to_simple_string (lp_time - p_time);

// Convert the ptime to a local_date_time object using the local time zone.
// We will create the time zone with the time difference string generated above.
local_date_time local_time (p_time, time_zone_ptr (new posix_time_zone (time_diff)));

// Calculate the difference in milliseconds between the UTC and local time.
auto time_t_diff = to_time_t (p_time) - to_time_t (local_time.local_time ());

// Return the given time in ms plus the time_t difference (to get the UTC ms).
return to_time_t (pt) + time_t_diff;
}

关于c++ - 将 boost ptime 从本地时间转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com