如何将纪元时间(unix时间戳)转换为D中的标准时间?有没有办法自定义格式?
答案 0 :(得分:4)
你真的应该把问题分开,而不是同时问两个完全不同的问题。
如果您需要将unix时间转换为SysTime
的“标准时间”,那么您使用unixTimeToStdTime
:
assert(unixTimeToStdTime(0) == (Date(1970, 1, 1) - Date.init).total!"hnsecs");
因此,如果您执行SysTime(unixTimeToStdTime(0))
,那么您将在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这样的库一起使用,则会出现互操作性问题实际上正确使用time_t
的.datetime。
你的意思是你正在寻找一种方法来为表示时间的字符串提供用户定义的格式(如C strftime
)? std.datetime还没有。 API仍然需要为它设计。已经进行了一些讨论,但尚未得到解决。所以,它最终会发生,但可能会有一段时间。
在此期间,您有toISOString
,toISOExtString
和toSimpleString
,它们分别使用ISO格式,ISO扩展格式和Boost的简单字符串格式。一般来说,我建议使用toISOExtString
,因为它很容易被人类和标准阅读。通常最好在与其他计算机通信时将其置于UTC(例如sysTime.toUTC()
)(而不是为人类打印),因为时区是其中的一部分,与LocalTime
不同,它不附加时区。
如果您尚未阅读this article on std.datetime,那么我建议您这样做,因为它应该让您对模块及其使用方法有一个很好的了解。
答案 1 :(得分:0)
我不熟悉D,但根据std.datetime,您可以使用这些步骤
long unixTimeToStdTime(time_t)
struct SysTime(long stdTime)
SysTime.dayOfGregorianCal()
struct Date(int day)
Date.toISOExtString()