【发布时间】:2013-02-15 21:41:08
【问题描述】:
如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?有没有办法自定义格式?
【问题讨论】:
标签: linux date time d unix-timestamp
如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?有没有办法自定义格式?
【问题讨论】:
标签: linux date time d unix-timestamp
你真的应该把问题分开,而不是同时问两个完全不同的问题。
如果您需要从 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 会将 std 时间转换为 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 不同,它没有t 附加时区。
如果您还没有阅读this article on std.datetime,那么我建议您阅读,因为它可以让您很好地了解该模块以及如何使用它。
【讨论】:
我不熟悉D,但是根据std.datetime,你可以使用这些步骤
long unixTimeToStdTime(time_t)struct SysTime(long stdTime)SysTime.dayOfGregorianCal()struct Date(int day)Date.toISOExtString()【讨论】: