【问题标题】:Golang time zone parsing not returning the correct zone on ubuntu serverGolang 时区解析未在 ubuntu 服务器上返回正确的区域
【发布时间】:2015-08-24 18:20:53
【问题描述】:

使用 Ubuntu 12.04

clientSendTimeHeaderFormat := "2006-01-02T15:04:05-0700"
ctx := "2015-04-01T10:04:00-0700"
clientSendTime, err  := time.Parse(clientSendTimeHeaderFormat, ctx)
name, offset := clientSendTime.Zone()

在服务器上,名称返回空,而偏移量在 -25200 处是正确的。 clientSendTime 打印为“2015-04-01 10:04:00 -0700 -0700”。

在我的 Mac 上本地运行它会正确返回名称和偏移量。该名称返回正确的区域“PDT”。在本地,clientSendTime 打印为“2015-04-01 10:04:00 -0700 PDT”

我还在本地运行时从服务器复制了 /usr/share/zoneinfo 文件夹,以确保它不是由于其中的差异造成的。

有谁知道造成这些差异的原因是什么?

【问题讨论】:

  • 你在哪个时区,你的服务器在哪个时区?
  • 我在 PDT,服务器是 UTC
  • Jon Skeet describes why 但是,如果客户端的文本时间格式由您决定,您可以切换到使用带有时区名称而不是数字偏移量的格式(例如 time.RFC1123有“... MST”)来保留名称。否则,您只能使用偏移量,您应该只使用/依赖 clientSendTime.Zone() 的第二个返回值而不是名称(如果您使用命名区域格式重新格式化这些时间,您将只获得您的本地区域或像“-0700”这样的数字)。

标签: ubuntu time go timezone


【解决方案1】:

好的,所以我想我知道为什么会发生这种情况 - 但不是很好的解决方法。

documentation for Parse 说:

在解析具有-0700 等区域偏移的时间时,如果偏移对应于当前位置(本地)使用的时区,则 Parse 在返回的时间中使用该位置和时区。否则,它将时间记录为在一个虚构的位置,时间固定在给定的区域偏移量。

由于您处于太平洋时间,时区偏移确实恰好与您的位置相匹配 - 因此它可以使用您当地的时区“名称”(ick;PDT 实际上不是时区名称,但我们将把它留到一边)。当您的服务器解析它时,它必须制造位置 - 这就是您看到“-0700 -0700”的原因。

从根本上说,您无法仅根据偏移量来确定时区 - 同一时间可能存在多个具有相同偏移量的时区,因此您无法预测原始时间的偏移量任何其他时间的区域。我建议您只记录您实际知道的信息 - 即偏移量 - 不要试图推断实际不存在的信息。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2013-07-23
    • 2011-06-09
    相关资源
    最近更新 更多