32位系统是否有64位unix时间戳转换的C ++实现?我需要将struct tm
转换为64位整数,反之亦然,包括闰年,时区,UTC。还需要它可移植,至少对于GNU / Linux和Windows。
答案 0 :(得分:11)
你需要:
typedef long long time64_t;
time64_t mktime64 (struct tm *t);
struct tm *localtime64_r (const time64_t *t, struct tm *p);
答案 1 :(得分:7)
将struct tm*
转换为time_t
的功能为mktime
。您可以找到它的许多实现,例如。在Glibc和libvxc's mktime.c
file。您可以获取代码(假设它是合法的,请尊重许可证)并将time_t
更改为某些64位整数,如int64_t
。
执行从time_t
到struct tm*
的其他转化的功能是localtime
或gmtime
,您也可以这样做。
但是,您可能有一个更基本的问题:在2040年运行的32位计算机应该能够在64位变量中适当地为您提供当前时间(正如time
系统调用所做的那样) time_t
,这更难(这取决于内核和硬件)。
答案 2 :(得分:6)
您似乎在假设time_t
在32位系统上是32位,这可能是也可能不是。
在Windows上,从Visual Studio 2005开始,即使编译32位Windows,time_t
的大小也是64位。
不幸的是,glibc将其定义为long int
,它在32位系统上是32位整数。这意味着基于gcc / glibc(如Cygwin)的32位Linux和其他32位平台将无法使用64位时间戳。
如果您的应用程序必须在32位glibc上运行,那么您应该使用自己的转换函数,这可能与重新编译的C库中的相同函数使用64位时间戳。
如果您需要具有许可许可证(BSD)的源代码,那么您可以在minix3中查看这些功能。 Here是当地时间。源是超链接的,因此您可以轻松找到其他源。
答案 3 :(得分:0)
是的,请使用stuct tm *_localtime64 ( const __time64_t *timer);
那就是你的窗扇。
答案 4 :(得分:0)
*time64
syscalls,您会看到这些系统调用仅在32位平台上可用。
但这只是内核方面的支持。您可以直接调用clock_gettime64
(从内联程序集调用,或者从带有this table函数的C中调用)以获取当前时间,但是由于还没有glibc支持,因此需要Linux特定的代码。要获得完整的 userspace 支持,您必须使用 Linux 5.6或更高版本以及musl 1.2+或glibc 2.32+。只需重建代码,time_t
就会变成64位长。现在,使用time_t
的代码将变得完全可移植
所有用户空间都必须使用64位
time_t
进行编译,在即将发布的musl-1.2和glibc-2.32版本以及从linux-5.6或更高版本安装的内核头文件中都将支持该功能。需要直接移植使用系统调用接口的应用程序,以使用linux-5.1中添加的
time64
syscall代替现有的系统调用。这会影响futex()
和seccomp()
的大多数用户,以及具有自己的基于libc的运行时环境的编程语言。
有关更多信息,请阅读