64位unix时间戳转换

时间:2011-10-27 10:01:17

标签: c++ windows linux time 64-bit

32位系统是否有64位unix时间戳转换的C ++实现?我需要将struct tm转换为64位整数,反之亦然,包括闰年,时区,UTC。还需要它可移植,至少对于GNU / Linux和Windows。

5 个答案:

答案 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_tstruct tm*的其他转化的功能是localtimegmtime,您也可以这样做。

但是,您可能有一个更基本的问题:在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)

在新的first introduced in the 5.1 kernel的基础上,{p3}在32位Linux上提供了64位时间支持(因为更改旧系统调用的返回类型会破坏旧应用程序)。选中*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的运行时环境的编程语言。

syscall()

有关更多信息,请阅读