你如何将纪元时间(unix timestamp)转换为D中的标准时间? 有没有一种方法来定制格式?
你真的应该把问题分开,而不是同时提出两个完全不同的问题。
如果你需要从Unix时间转换到SysTime
的“标准时间”,那么你使用unixTimeToStdTime
:
assert(unixTimeToStdTime(0) == (Date(1970, 1, 1) - Date.init).total!"hnsecs");
所以,如果你使用SysTime(unixTimeToStdTime(0))
,那么你会在当地时区的1970年1月1日午夜(UTC时间点)(即时代)得到一个SysTime
。 与其他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偏移量永不改变,这意味着一年中有一大段时间是错误的。 它适用于所有使用time_t
的微软函数,因为他们期望废话,但是如果您尝试在另一个盒子或者像std.datetime这样的库中使用Windows time_t
,并且实际上正确使用time_t
,将会产生互操作性问题。
你的意思是你正在寻找一种方法来为表示时间的字符串提供一个用户定义的格式(比如C的strftime
)? std.datetime还没有。 API仍然需要为它设计。 一些讨论已经发生,但还没有解决。 所以,最终会发生,但可能会有一段时间。
在此期间,您需要分别使用ISO格式,ISO扩展格式和Boost简单字符串格式的ISO字符串, toISOExtString
和toSimpleString
。 一般来说,我建议使用toISOExtString
,因为它很容易被人类和标准读取。 当与其他计算机通信(而不是为人类打印)时,通常最好使用UTC(例如sysTime.toUTC()
),因为时区是其中的一部分,与LocalTime
不同, t追加时区。
如果你还没有阅读关于std.datetime的这篇文章 ,那么我建议你这样做,因为它应该给你一个关于模块的良好概述以及如何使用它。
我不熟悉D,但根据std.datetime ,您可以使用这些步骤
long unixTimeToStdTime(time_t)
struct SysTime(long stdTime)
SysTime.dayOfGregorianCal()
struct Date(int day)
Date.toISOExtString()