【问题标题】:How to format a date-time to display the timezone in IANA format?如何格式化日期时间以显示 IANA 格式的时区?
【发布时间】:2022-01-04 16:21:46
【问题描述】:

以下代码

fmt.Println(time.Now().Format("2 Jan 2006 03:04:05PM MST"))

打印

26 Nov 2021 04:00:31PM GMT

如何将时区格式化为Europe/London,即IANA format?预期的输出是

26 Nov 2021 04:00:31PM Europe/London

【问题讨论】:

  • afaik,没有选项可以从 .Format 方法中检索它。您可以使用第三方库,例如go-timezone-local,获取您所在时区的 IANA 名称并将其添加到字符串之前。
  • @MrFuppes - 我检查了您的图书馆并感谢您的倡议。但是,它还有很多需要发展的地方,例如我不知道如何使用这个库解析像"26 Nov 2021 04:00:00 PM Asia/Kolkata" 这样的字符串。正确的解析将返回类似26 Nov 2021 10:30:00 AM Europe/London 的内容(假设系统的本地时区为Europe/London)。
  • 将字符串解析为日期时间是另一回事,这绝不是链接库的意图。你也没有在你的问题中提到解析,所以我没有考虑到它;-)
  • 我正在浏览news.ycombinator.com/item?id=10195947,我忍不住笑了,因为作者声称 Go 的日期时间库是最丰富的。到目前为止,无论我做了什么研究,Java 的 Date-Time API 都更丰富、更简单。
  • 那篇文章读起来更像是 go time 播客的一个不受欢迎的观点 ^^ 关于 Python 日期时间的 cmets 也有点搞笑。但它大约六岁了,所以作者的观点可能已经改变了。

标签: datetime go timezone


【解决方案1】:

没有直接使用time 格式布局的选项。

不过,Location.String在大多数情况下会打印 IANA 名称。

String 返回时区信息的描述性名称,对应于 LoadLocation 或 FixedZone 的名称参数。

LoadLocation 通常将 IANA 字符串作为输入:

如果名称是“”或“UTC”,LoadLocation 将返回 UTC。如果名称为“Local”,则 LoadLocation 返回 Local。

否则,该名称将被视为与 IANA 时区数据库中的文件对应的位置名称,例如“America/New_York”。

现在 "Local" 不是有效的 IANA 名称,但 "UTC" 是 — 嗯,实际上 UTCEtc/UTC 的别名。

std time 包的另一个问题是 Location.String 将打印传递给 FixedZone 的名称,这实际上可以是任何东西。

因此,如果您能够假设您的 time.Location 是如何实例化的,那么以下可能是一个可行的解决方案:

fmt.Printf("%s %s", t.Format("2 Jan 2006 03:04:05PM"), t.Location())

否则你将不得不使用一些第三方包,或者推出你自己的映射。

【讨论】:

  • t.Location 给了我例如 LocalCET 3600 (在 Ubuntu Linux 上,在 tz Europe/Berlin)——我认为这与 IANA tz 名称相去甚远。
  • @MrFuppes @Beginner 如果t 来自time.Now() 这将不起作用,因为该位置可能一开始就没有加载 IANA 数据库。这就是为什么我说“如果你能做出假设”
  • 你是对的,如果 *Location 在时间实例中设置,字符串 repr 将是 IANA 名称(有提到的例外)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2019-07-15
  • 2017-03-22
相关资源
最近更新 更多