如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?有没有办法自定义格式?
2 回答
你真的应该把问题分开,而不是同时问两个完全不同的问题。
如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?
如果您需要从 unix 时间转换为SysTime
“标准时间”,那么您可以使用unixTimeToStdTime
:
assert(unixTimeToStdTime(0) == (Date(1970, 1, 1) - Date.init).total!"hnsecs");
因此,如果您这样做SysTime(unixTimeToStdTime(0))
,您将SysTime
在 UTC 的 1970 年 1 月 1 日午夜(即纪元时间)的时间点获得当地时区的 a。与其他SysTime
构造函数不同,它不会将给定的时间视为在给定的时区中。相反,它只是将其设置stdTime
为给定值,并且设置timezone
为给定值。因此,要构造SysTime
与其他构造函数相同的构造函数,您需要执行类似的操作
auto epochInLocalTime = SysTime(Date(1970, 1, 1), UTC()).toLocalTime();
如果你想在相反的方向转换,stdTimeToUnixTime
将 std 时间转换为 unix 时间。但是,SysTime
有toUnixTime
它,使您通常不需要stdTimeToUnixTime
.
time_t epoch = epochInLocalTime.toUnixTime();
但是,需要注意的一件事是 std.datetime 真正处理 unix 时间的事实 -time_t
始终被认为是 UTC。这很重要的原因是,由于某种莫名其妙的原因,Windows 将本地时间的 DST 应用于time_t
UTC 偏移量永远不会改变,这意味着它在一年中的大部分时间都是错误的。它适用于所有使用 Microsoft 的函数time_t
,因为他们认为这是无稽之谈,但是如果您尝试将 Windowstime_t
与另一个盒子或 std.datetime 等实际time_t
正确使用的库一起使用,则会遇到互操作性问题。
有没有办法自定义格式?
您的意思是您正在寻找一种方法来为表示时间的字符串(如 C's strftime
)提供用户定义的格式?std.datetime 还没有。API 仍然需要为其设计。已经进行了一些讨论,但尚未解决。所以,它最终会发生,但可能需要一段时间。
在此期间,您有toISOString
、toISOExtString
和toSimpleString
,它们分别使用 ISO 格式、ISO 扩展格式和 Boost 的简单字符串格式。一般来说,我建议使用toISOExtString
,因为它既易于人类阅读,又易于标准阅读。sysTime.toUTC()
在与其他计算机通信(而不是为人类打印出来)时,通常最好将它放在 UTC(例如)中,因为时区是它的一部分,与LocalTime
不附加时区的 with 不同。
如果您还没有阅读有关 std.datetime 的这篇文章,那么我建议您阅读,因为它应该可以很好地概述该模块以及如何使用它。
我不熟悉 D,但根据std.datetime,您可以使用这些步骤
long unixTimeToStdTime(time_t)
struct SysTime(long stdTime)
SysTime.dayOfGregorianCal()
struct Date(int day)
Date.toISOExtString()