4

如何将纪元时间(unix 时间戳)转换为 D 中的标准时间?有没有办法自定义格式?

4

2 回答 2

4

你真的应该把问题分开,而不是同时问两个完全不同的问题。

如何将纪元时间(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 时间。但是,SysTimetoUnixTime它,使您通常不需要stdTimeToUnixTime.

time_t epoch = epochInLocalTime.toUnixTime();

但是,需要注意的一件事是 std.datetime 真正处理 unix 时间的事实 -time_t始终被认为是 UTC。这很重要的原因是,由于某种莫名其妙的原因,Windows 将本地时间的 DST 应用于time_tUTC 偏移量永远不会改变,这意味着它在一年中的大部分时间都是错误的。它适用于所有使用 Microsoft 的函数time_t,因为他们认为这是无稽之谈,但是如果您尝试将 Windowstime_t与另一个盒子或 std.datetime 等实际time_t正确使用的库一起使用,则会遇到互操作性问题。

有没有办法自定义格式?

您的意思是您正在寻找一种方法来为表示时间的字符串(如 C's strftime)提供用户定义的格式?std.datetime 还没有。API 仍然需要为其设计。已经进行了一些讨论,但尚未解决。所以,它最终会发生,但可能需要一段时间。

在此期间,您有toISOStringtoISOExtStringtoSimpleString,它们分别使用 ISO 格式、ISO 扩展格式和 Boost 的简单字符串格式。一般来说,我建议使用toISOExtString,因为它既易于人类阅读,又易于标准阅读。sysTime.toUTC()在与其他计算机通信(而不是为人类打印出来)时,通常最好将它放在 UTC(例如)中,因为时区是它的一部分,与LocalTime不附加时区的 with 不同。

如果您还没有阅读有关 std.datetime 的这篇文章,那么我建议您阅读,因为它应该可以很好地概述该模块以及如何使用它。

于 2013-02-15T23:50:31.547 回答
-1

我不熟悉 D,但根据std.datetime,您可以使用这些步骤

  • long unixTimeToStdTime(time_t)
  • struct SysTime(long stdTime)
  • SysTime.dayOfGregorianCal()
  • struct Date(int day)
  • Date.toISOExtString()
于 2013-02-15T22:49:27.230 回答