c++ - 使用 ctime 将带时区的本地时间转换为 UTC

标签 c++ timezone ctime

我一直在绞尽脑汁试图解决这个问题 with this API

我最初的实现是这样的:

// TimezonePtr is just a share_ptr to the timezone 
std::tm getGMT(const std::tm& rawtime, TimezonePtr tz)
{
    std::tm result = rawtime;
    const auto loct = mktime_z(tz.get(), &result);
    gmtime_r(&loct, &result);
    return result;
}

但是,这没有考虑夏令时。例如,如果我给它输入日期 Sep 28 2012 15:54:24,我会返回 Sep 28 2012 20:54:24,这是不正确的。看起来我想使用 localtime_rz,只是需要一个纪元,这让我抓狂,因为如果我能得到纪元,那么我就已经有了答案。 :(

我怎样才能做到这一点?

最佳答案

mktime_zstruct tm 作为其参数之一。如果您不知道夏令时是否对输入日期有效,您希望将 tmtm_isdst 成员设置为 -1表示当您调用 mktime 时,系统应该确定 DST 是否对该日期/时间/时区有效。

至少对我来说,这似乎工作正常(即,它正确地得出结论,至少在我所在的时区,DST 在 2012 年 9 月生效)。

关于c++ - 使用 ctime 将带时区的本地时间转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38310778/

相关文章:

C 截断 HH :MM:SS from ctime value, ctime

c++ - GMT\UTC 与 DST 的历史时间

c++ - 从初始化列表初始化 std::tuple

c++ - 带有 "custom build tool"项目的 TFS 构建服务器

c++ - -O1 改变 float 学

c++ - 寻找另一个成员对象不是 tm 的时间结构

c++ - 使用 ISO C++0x 线程会降低性能

datetime - 当数据依赖于日期时间时在数据库中保存日期时间和时区信息的最佳实践

php - MySQL 和 PHP 中的时间戳比较(UT​​C、+0000、时区)

javascript - 如何在使用 reSTLet 时将时区更改为 netsuite 中的另一个时区