Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将时区从本地时区转换为UTC_C++ - Fatal编程技术网

C++ 将时区从本地时区转换为UTC

C++ 将时区从本地时区转换为UTC,c++,C++,我有一个time\u t,它表示从新纪元开始的时间(以秒为单位)。这些秒指的是当地时间 我想把它们转换成UTC 在C++中有没有这样的方法?< p>可以使用GMSTIME: 将time\u t转换为tm,因为UTC时间使用计时器指向的值 用表示相应的值填充tm结构 时间,表示为UTC时间(即GMT时区的时间) (c) 我将展示两种方法: 使用C API 使用基于之上的现代C++11/14库 在本演示中,我假设本地时区的当前秒数为1470003841。我的本地时区是美国/纽约,因此我得到的结果反映

我有一个
time\u t
,它表示从新纪元开始的时间(以秒为单位)。这些秒指的是当地时间

我想把它们转换成UTC

在C++中有没有这样的方法?

< p>可以使用GMSTIME:

将time\u t转换为tm,因为UTC时间使用计时器指向的值 用表示相应的值填充tm结构 时间,表示为UTC时间(即GMT时区的时间)


(c) 我将展示两种方法:

  • 使用C API
  • 使用基于
    之上的现代C++11/14库
  • 在本演示中,我假设本地时区的当前秒数为1470003841。我的本地时区是美国/纽约,因此我得到的结果反映出我们目前处于协调世界时-0400

    首先是C API:

    此API不是类型安全的,并且非常容易出错。我在编写这个答案的时候犯了几个错误,但是我能够很快发现这些错误,因为我是在对照第二种技术检查答案

    #include <ctime>
    #include <iostream>
    
    int
    main()
    {
        std::time_t lt = 1470003841;
        auto local_field = *std::gmtime(&lt);
        local_field.tm_isdst = -1;
        auto utc = std::mktime(&local_field);
        std::cout << utc << '\n'; // 1470018241
        char buf[30];
        std::strftime(buf, sizeof(buf), "%F %T %Z\n", &local_field);
        std::cout << buf;
        auto utc_field = *std::gmtime(&utc);
        std::strftime(buf, sizeof(buf), "%F %T UTC\n", &utc_field);
        std::cout << buf;
    }
    
    现在在你开始之前(我个人第一次把这部分搞糟了),你必须增加这个字段类型,说你不知道它现在是否是夏令时。这会导致后续步骤为您找出答案:

    local_field.tm_isdst = -1;
    
    接下来,您可以使用
    make_time
    将本地
    tm
    转换为UTC
    time

    auto utc = std::mktime(&local_field);
    
    你可以打印出来,对我来说是:

    1470018241
    
    这比4小时大。该函数的其余部分是以人类可读的格式打印这些时间,以便您可以调试这些内容。对我来说,it输出:

    2016-07-31 22:24:01 EDT
    2016-08-01 02:24:01 UTC
    
    < P> <强>一个现代C++ API:< /强>

    std::lib中没有用于执行此操作的工具。但是,您可以将其用于此

    #include "date/tz.h"
    #include <iostream>
    
    int
    main()
    {
        using namespace date;
        using namespace std::chrono_literals;
        auto zt = make_zoned(current_zone(), local_seconds{1470003841s});
        std::cout << zt.get_sys_time().time_since_epoch() << '\n'; // 1470018241s
        std::cout << zt << '\n';
        std::cout << zt.get_sys_time() << " UTC\n";
    }
    
    下一步要做的是创建一个
    分区时间
    ,它是本地时间和当前时区的配对:

    auto zt = make_zoned(current_zone(), local_seconds(1470003841s));
    
    然后,您只需打印出此配对的UTC秒数:

    std::cout << zt.get_sys_time().time_since_epoch() << '\n';
    
    (比输入晚4小时)。要像在C API中那样打印此结果,请执行以下操作:

    std::cout << zt << '\n';
    std::cout << zt.get_sys_time() << " UTC\n";
    

    在这种现代C++方法中,本地时间和UTC时间是不同的类型,这使得我更容易在编译时捕获这两个概念的意外混合(而不是创建运行时错误)。 C++20的更新 第二种技术将在C++20中提供,其语法如下:

    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace std::chrono;
        zoned_time zt{current_zone(), local_seconds{1470003841s}};
        std::cout << zt.get_sys_time().time_since_epoch() << '\n'; // 1470018241s
        std::cout << zt << '\n';
        std::cout << zt.get_sys_time() << " UTC\n";
    }
    
    #包括
    #包括
    int
    main()
    {
    使用名称空间std::chrono;
    分区时间zt{current_zone(),本地时间{1470003841s};
    
    std::cout如果您同意使用,另一种方法是:

    auto civil_second =
      absl::LocalTimeZone().At(absl::FromTimeT(<your time_t>)).cs;
    
    time_t time_in_utc = absl::ToTimeT(absl::FromCivil(civil_second, absl::UTCTimeZone()));
    
    auto-civil\u秒=
    absl::LocalTimeZone().At(absl::FromTimeT()).cs;
    utc=absl::TOTIME(absl::FromCivil(civil_second,absl::UTCTimeZone());
    

    (也许库中有一组更简单的调用可以实现这一点,但我没有进一步探讨。:))

    不知道为什么会沮丧?这个问题非常具体和明确。与问题结束的原因相同:无:-)你是对的,这个问题永远不会太宽泛,这里没有任何错误…只需忘记SO中的投票。有效的
    time\u t
    值(在类Unix系统上)总是相对于1970-01-01 00:00:00 UTC。你是如何得到这样一个指向本地时间的值的?
    gmtime
    假设一个基于UTC的
    time
    值。OP说他有一个基于本地时间的
    time
    值——我怀疑这是一个误解。
    std::cout << zt << '\n';
    std::cout << zt.get_sys_time() << " UTC\n";
    
    2016-07-31 22:24:01 EDT
    2016-08-01 02:24:01 UTC
    
    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace std::chrono;
        zoned_time zt{current_zone(), local_seconds{1470003841s}};
        std::cout << zt.get_sys_time().time_since_epoch() << '\n'; // 1470018241s
        std::cout << zt << '\n';
        std::cout << zt.get_sys_time() << " UTC\n";
    }
    
    auto civil_second =
      absl::LocalTimeZone().At(absl::FromTimeT(<your time_t>)).cs;
    
    time_t time_in_utc = absl::ToTimeT(absl::FromCivil(civil_second, absl::UTCTimeZone()));