11

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

4

5 回答 5

13

你需要:

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,它也实现了mktime64and localtime64_r

https://github.com/evalEmpire/y2038

于 2011-11-07T10:30:33.580 回答
7

struct tm*将 a 转换为 a的函数time_tmktime。您可以找到它的许多实现,例如。在 Glibc 和libvxc 的mktime.c文件中。您可以获取代码(假设它对您是合法的,所以请尊重许可证)并更改time_t为一些 64 位整数,例如int64_t.

time_t从to进行其他转换的函数struct tm*localtimeor gmtime,您也可以这样做。

time但是,您可能有一个更根本的问题:您在 2040 年运行的 32 位机器应该有某种方式在 64 位变体中适当地为您提供当前时间(如系统调用所做的那样) time_t,而这要困难得多(它取决于内核和硬件)。

于 2011-11-04T17:33:13.073 回答
6

您似乎在假设time_t32 位系统上是 32 位,这可能是真的,也可能不是。

在 Windows 上,从 Visual Studio 2005 开始,大小time_t为 64 位,即使您为 32 位 Windows 编译也是如此。

不幸的是,glibc 将其定义为long int,在 32 位系统上是 32 位整数。这意味着 32 位 Linux 和其他基于 gcc/glibc(如 Cygwin)的 32 位平台将无法使用 64 位时间戳。

如果您的应用程序必须在 32 位 glibc 上运行,那么您应该使用自己的转换函数,这可能是重新编译为使用 64 位时间戳的 C 库中的相同函数。

如果您需要具有许可许可证 (BSD) 的源代码,那么您可以在 minix3 中查看这些功能。这里是当地时间。来源是超链接的,因此您可以轻松找到其他来源。

于 2011-11-06T06:22:07.397 回答
0

32 位 Linux 上的 64 位时间支持首先在5.1 内核中引入,并添加了新的*time64系统调用(因为更改旧系统调用的返回类型会破坏旧应用程序)。检查此表,您会发现这些系统调用仅在 32 位平台上可用。

但这只是内核方面的支持。您可以clock_gettime64直接调用(从内联汇编,或从 Csyscall()函数调用)来获取当前时间,但您需要特定于 Linux 的代码,因为目前还没有 glibc 支持。要获得完整的用户空间支持,您必须使用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 或更高版本的内核头文件将支持该版本。

  • 直接使用系统调用接口的应用程序需要移植以使用time64linux-5.1 中添加的系统调用来代替现有的系统调用。这会影响大多数用户futex()以及seccomp()拥有自己的运行时环境而不基于 libc 的编程语言。

https://lkml.org/lkml/2020/1/29/355?anz=web

欲了解更多信息,请阅读

于 2020-11-18T15:35:44.970 回答
-1

是的,使用stuct tm *_localtime64 ( const __time64_t *timer);

那是如果你的窗户风扇。

于 2011-11-07T02:34:53.120 回答