- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 time_t
表示自纪元以来的时间(以秒为单位)。这些秒数是指本地时间。
我想将它们转换为 UTC。
有没有办法在 C++ 中做到这一点?
最佳答案
我将展示两种方法:
<chrono>
的现代 C++11/14 库.出于本演示的目的,我假设本地时区的当前秒数是 1,470,003,841。我的本地时区是 America/New_York,因此我得到的结果反射(reflect)我们目前处于 -0400 UTC。
首先是 C API:
此 API 不是类型安全的并且很容易出错。我在编写这个答案时犯了几个错误,但我能够快速检测到这些错误,因为我是根据第二种技术检查答案的。
#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;
}
首先我初始化 time_t
.现在没有可从本地获取的 C API time_t
到 UTC time_t
.但是你可以使用 gmtime
从 UTC time_t
到 UTC tm
(从序列到字段类型,都在 UTC 中)。所以第一步是说 gmtime
,告诉它你有一个 UTC time_t
.然后当你得到结果时,你就假装你有一个本地 tm
而不是 UTC tm
.到目前为止清楚吗?这是:
auto local_field = *std::gmtime(<);
现在在您开始之前(我个人第一次把这部分搞砸了)您必须扩充此字段类型以表明您不知道当前是否是夏令时。这会导致后续步骤为您解决这个问题:
local_field.tm_isdst = -1;
接下来你可以使用make_time
转换本地 tm
到 UTC time_t
:
auto utc = std::mktime(&local_field);
你可以打印出来,对我来说是:
1470018241
多了 4 小时。该函数的其余部分是以人类可读的格式打印出这些时间,以便您可以调试这些东西。对我来说它输出:
2016-07-31 22:24:01 EDT
2016-08-01 02:24:01 UTC
现代 C++ API:
std::lib 中不存在执行此操作的工具。但是你可以使用这个 free, open source (MIT license) library为此。
#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";
}
第一步是以自纪元以来的秒数为单位创建本地时间:
local_seconds{1470003841s}
接下来要做的是创建一个 zoned_time
这是本地时间和当前时区的配对:
auto zt = make_zoned(current_zone(), local_seconds(1470003841s));
然后您可以简单地打印出此配对的 UTC 秒数:
std::cout << zt.get_sys_time().time_since_epoch() << '\n';
我的这个输出:
1470018241s
(比输入晚 4 小时)。要像我在 C API 中那样打印出这个结果:
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
在这种现代 C++ 方法中,本地时间和 UTC 时间是不同的类型,这使得我更有可能在编译时偶然发现这两个概念的混合(而不是造成运行时错误)。
第二种技术将在 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";
}
关于c++ - 将 time_t 从本地时区转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686405/
我想将日期时间字符串保存到 time_t,然后将其转换回完全原始的字符串。 但是下面的代码会输出"2016-04-25_10:10:05" 并且通过更改 date_str,输出中的小时将不正确。 如果
我有两个 time_t 变量:timeA 和 timeB。 我想做的是检查 timeA 是否与 timeB 相同。但是,我知道在某些情况下它们不会完全相同,两者之间可能会有 1 或 2 秒的差异,所以
我正在尝试编写函数来帮助自己轻松地将 string 转换为 time_t 并将 time_t 转换为 string。然而,它总是给我错误的一年和一个错误的时间。怎么了? 我需要它独立于操作系统! 例如
time_t raw_time = time(NULL); tm* current_time = localtime(&raw_time); 我自己得到了答案......我完全搞砸了警告。无论如何谢谢
我的 time_t 值为 1530173696,代表 2018 年 6 月 28 日,星期四 8:14:56 AM。 我想将时间向下舍入到最接近的小时。具体来说,向下到 1530172800,代表 T
我正在开发嵌入式系统。我们的平台是 32 位,因此 time_t 大小是 32 位。 现在我想将一个结构作为 char 数组发送到 Windows 7 计算机。我的结构体的字段之一是time_t。我无
time_t 这是依赖于平台的类型。我发现 difftime 以秒为单位返回差异,但我没有找到无需任何转换即可进行简单减法的函数。我怎么知道标准不保证在整个时间连续体中始终如一,并且没有说明有关 ti
我正在尝试转换 static char bufferTR[] = "1645"; 像这样的事情...... struct tm *tick_time = localtime(&temp); 在此函数中
在我当前的项目中,我有一个 C 结构来保存时间戳,如下所示: struct timestamp { uint16_t year; uint8_t month; uint8_t day
我有从 2004 年到特定日期的毫秒数。我想将其转换为 time_t 以使用 ctime() 显示它? 也许还有另一种方法可以通过这个毫秒时间戳来可视化日期,有人有吗? 最佳答案 假设“从 2004
我应该如何修改此代码以在每 00:00AM 打印(“Its Midnight”)? #include #include int main(void) { struct tm * localti
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我是 C 编程新手,我需要一些帮助来完成一个简单的任务。 所以我有这个功能: char *time2str(time_t time) { static_char *str_fmt = "%0
我正在使用处理 time_t 的 API。现在我也有一个来自 API 的结果,它也在 time_t 中检索数据,但问题是第一个只需要日期、小时和分钟,但我检索的数据包括秒,我如何从数据中删除秒>
我正在尝试将“Tue Feb 13 00:26:36 2018”转换为 time_t,我该怎么做,我尝试寻找一个函数但找不到。这是使用非托管 C++。 最佳答案 如果你使用的是 C++11,你可以这样
我有一个 double 的纪元,需要传入一个需要 time_t 的函数。如何将 double 中的纪元转换为 time_t?我在 Linux 上使用 C++ 代码。谢谢。 最佳答案 如果你在 doub
根据 http://www.cplusplus.com/reference/clibrary/ctime/time_t/ time_t 是自 1970 年 1 月 1 日午夜 UTC 以来的秒数。因此
我试图找出时间将溢出 time_t 值的日期 #include #include #include main(){ time_t now,end; now=time(NU
如果我有这个字符串: 2011-10-08T07:07:09Z 是否有可能从中获取time_t?如果可以,如何实现? 最佳答案 是的,是的。首先,使用 strptime(3) 将其转换为 segmen
我不明白为什么这会抛出undefined reference to `floor'”: double curr_time = (double)time(NULL); return floor(curr
我是一名优秀的程序员,十分优秀!