如何将纪元时间(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 仍然需要为它设计。已经进行了一些讨论,但尚未解决。所以,它最终会发生,但可能需要一段时间。在此期间,您有
toISOString
、 toISOExtString
和 toSimpleString
,它们分别使用 ISO 格式、ISO 扩展格式和 Boost 的简单字符串格式。一般来说,我建议使用 toISOExtString
,因为它既易于人类阅读又易于标准阅读。通常最好在与其他计算机通信时将它放在 UTC(例如 sysTime.toUTC()
)中(而不是为人类打印出来),因为时区是其中的一部分,与 LocalTime
不同,它不附加时间区。如果你还没有读过 this article on std.datetime,那么我建议你读一读,因为它应该让你对模块以及如何使用它有一个很好的概述。
关于linux - 如何将 D 中的纪元时间(unix 时间戳)转换为标准(年-月-日),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14903772/