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++11/14库#include <ctime>
#include <iostream>
int
main()
{
std::time_t lt = 1470003841;
auto local_field = *std::gmtime(<);
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
转换为UTCtime
:
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()));