有没有适用于32位系统的64位Unix时间戳转换的C++实现? 我需要将 struct tm
转换为64位整数,反之亦然,包括闰年,时区和协调世界时。而且我需要它能够跨平台运行,至少能在GNU / Linux和Windows上使用。
有没有适用于32位系统的64位Unix时间戳转换的C++实现? 我需要将 struct tm
转换为64位整数,反之亦然,包括闰年,时区和协调世界时。而且我需要它能够跨平台运行,至少能在GNU / Linux和Windows上使用。
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
最初(2011年),这个答案包含指向2038bug.com的链接,可以下载包含所述函数的小型pivotal_gmtime_r库。那个库已经从2038bug.com中删除,链接已经失效并被管理员从答案中删除。现在似乎可以在此处找到pivotal_gmtime_r代码:
https://github.com/franklin373/mortage/tree/master/time_pivotal
此外,我还发现另一个更近期的库,称为y2038,也实现了mktime64和localtime64_r:
localtime
这么多次,我混淆了。 :) 当然你需要gmtime64_r
。 - Alexei Khlebnikovmktime
期望本地时间,并且会从您的本地设置中获取时区并将其转换为 UTC
。但是这个 mktime64
是“时区无关的”。也就是说,如果您提供了输入 struct tm
在 UTC
中,它将以 UTC
的形式给出输出 time64_t
,如果您提供了 UTC+10
的输入,则输出为 UTC+10
等。 - Alexei Khlebnikovack mktime64 /usr/include/
没有返回结果。 - dargaudstruct tm*
转换为time_t
的函数是mktime
。你可以在多个实现中找到它,例如在Glibc和libvxc的mktime.c
文件中。你可以采用这些代码(假设它们对你合法,请尊重许可证),将time_t
更改为像int64_t
这样的64位整数。time_t
转换为 struct tm*
的其他功能是 localtime
或 gmtime
,你也可以采用类似的方法进行更改。time_t
形式提供当前时间(与time
系统调用相同),这要困难得多(这取决于内核和硬件)。localtime
? - Adam Trhontime_t
可以是 32 位或 64 位整数类型(因此机器代码必须不同)。 - Basile Starynkevitchlibvxc
相当不错。顺便说一句,修复本地->UTC转换问题只需要一行代码,所以这并不是一个问题。 - Agnius Vasiliauskastime_t
是32位的,事实可能并非如此。time_t
的大小也为64位。long int
,这在32位系统上是一个32位的整数。这意味着基于gcc/glibc(如Cygwin)的32位Linux和其他32位平台将无法使用64位时间戳。32位Linux上的64位时间支持是在5.1内核中首次引入的,新增了新的*time64
系统调用(因为更改旧系统调用的返回类型会破坏旧应用程序)。查看这个表格,你会发现这些系统调用仅适用于32位平台。
clock_gettime64
(通过内联汇编或使用{{link1:syscall()
}}函数)来获取当前时间,但是您需要使用特定于Linux的代码,因为目前还没有glibc的支持。要获得完整的用户空间支持,您必须在Linux 5.6或更高版本以及musl 1.2+或glibc 2.32+上运行。只需重新构建您的代码,time_t
将变为64位长。现在使用time_t
的代码将变得完全可移植。time_t
进行编译,这将在即将发布的musl-1.2和glibc-2.32版本中得到支持,同时还需要安装来自linux-5.6或更高版本的内核头文件。time64
系统调用来替换现有的系统调用。这会影响大多数futex()
和seccomp()
的用户,以及那些基于libc之外的运行时环境的编程语言。如果你是Windows的粉丝,可以使用stuct tm *_localtime64 ( const __time64_t *timer);
time_t
不是已经64位了吗?Windows也有大多数函数的64位变体。只需在Google上搜索即可。 - RedX