如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?有没有办法自定义格式?

最佳答案

你真的应该把问题分开,而不是同时问两个完全不同的问题。

如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?

如果您需要从 unix 时间转换为 SysTime 的“标准时间”,那么您可以使用 unixTimeToStdTime :

assert(unixTimeToStdTime(0) == (Date(1970, 1, 1) - Date.init).total!"hnsecs");

因此,如果您执行 SysTime(unixTimeToStdTime(0)) ,您将在 UTC 时间 1970 年 1 月 1 日午夜(即纪元时间)的本地时区获得 SysTime。与其他 SysTime 构造函数不同,它不会将给定的时间视为在给定的时区中。相反,它只是将其 stdTime 设置为给定的值,并将 timezone 设置为给定的值。因此,要使用其他构造函数构造相同的 SysTime,您可以执行以下操作
auto epochInLocalTime = SysTime(Date(1970, 1, 1), UTC()).toLocalTime();

如果要反方向转换,stdTimeToUnixTime 会将标准时间转换为 unix 时间。但是, SysTime 上有 toUnixTime ,因此您通常不需要 stdTimeToUnixTime
time_t epoch = epochInLocalTime.toUnixTime();

然而,需要注意的一件事是 std.datetime 真正处理 unix 时间 - time_t 总是被认为是在 UTC 中。这很重要的原因是出于某种莫名其妙的原因,Windows 将本地时间的 DST 应用于 time_t,以便 UTC 偏移量永远不会改变,这意味着它在一年中的大部分时间都是错误的。它适用于所有使用 time_t 的 Microsoft 函数,因为他们期望那些无意义的函数,但是如果您尝试将 Windows time_t 与另一个框或 std.datetime 之类的库一起使用,实际上会正确使用 time_t,则会遇到互操作性问题。

有没有办法自定义格式?

您的意思是您正在寻找一种方法来为表示时间的字符串(如 C 的 strftime )提供用户定义的格式? std.datetime 还没有。 API 仍然需要为它设计。已经进行了一些讨论,但尚未解决。所以,它最终会发生,但可能需要一段时间。

在此期间,您有 toISOStringtoISOExtStringtoSimpleString ,它们分别使用 ISO 格式、ISO 扩展格式和 Boost 的简单字符串格式。一般来说,我建议使用 toISOExtString ,因为它既易于人类阅读又易于标准阅读。通常最好在与其他计算机通信时将它放在 UTC(例如 sysTime.toUTC() )中(而不是为人类打印出来),因为时区是其中的一部分,与 LocalTime 不同,它不附加时间区。

如果你还没有读过 this article on std.datetime,那么我建议你读一读,因为它应该让你对模块以及如何使用它有一个很好的概述。

关于linux - 如何将 D 中的纪元时间(unix 时间戳)转换为标准(年-月-日),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14903772/

10-14 16:16
查看更多