【问题标题】:Change time.Time timezone without reparsing更改 time.Time 时区而不重新解析
【发布时间】:2017-05-15 16:23:32
【问题描述】:

我正在处理使用错误时区解析的 time.Time 对象。它们内部有一个 UTC tz,但原始数据来自一个遗留的 MySQL 数据库,该数据库在内部存储带有欧洲/巴黎时区的日期时间。

我想更改时间的内部时区而不重新解析它。我尝试了 time.In() 函数,但它不能解决我的用例,因为它为另一个时区返回相同的时间。

我的最终解决方案是使用https://golang.org/pkg/time/#ParseInLocation 从具有正确位置的原始值重新创建日期。但是,如果可以避免这种情况,那就更好了。

有什么想法吗?

谢谢。

【问题讨论】:

  • 你希望它最终与什么 TZ 关联? UTC 还是本地?
  • @peterSO 问题很清楚,我不需要任何代码。如果你不同意,你可以投反对票。
  • 您的数据库中的确切格式是什么?是否有明确的 TZ 与之关联?

标签: parsing go time timezone


【解决方案1】:

你能不能给他们Add一个固定的节日?

t,_ := time.Parse(...)
t = t.Add(-4 * time.Hour) // or whatever offset makes it work

// t is now correct utc time
// In should work less badly:
localTime := t.In(myRealLocation)

【讨论】:

  • 谢谢,这是一个很好的线索。对此有什么想法吗?我想没有办法知道它,因为 MySQL 日期时间类型不存储任何 tz/offset。
  • 丑。时间是最糟糕的。你真的有适应 DST 的本地时间戳,而没有注明他们的时区信息吗?如果是这样,我想不出除了检查日期和调整偏移量之外的方法。
  • 在没有时区信息的情况下存储时间戳真的应该是死罪......
  • 存储 utc 以外的任何内容都是自找麻烦。
  • 是的,mysql 服务器根据其配置的时区(欧洲/巴黎)插入日期,遗憾的是 datetime 类型不带有任何 tz/offset。无论如何,我会将 yhis 标记为已接受,因为它符合我的要求。我一开始并没有想到这一点。 @Kaedys 我同意,但这是一个非常古老的遗留数据库,我几乎无法控制。
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多