【问题标题】:Ruby - Parse timestamp as though it's in a specific timezoneRuby - 解析时间戳,就好像它在特定时区一样
【发布时间】:2017-09-10 04:18:17
【问题描述】:

我正在从 Mixpanel 导出一些数据并尝试读取时间戳。但是,Mixpanel 以 UTC 以外的方式发送时间戳。

混合面板文档

时间戳以自 1970 年 1 月 1 日以来的秒数表示在您项目的时区中,而不是 UTC 作为真正的纪元时间戳。例如,如果您的项目设置为太平洋时间,您需要添加8 小时(如果不是夏令时,则为 7 小时)(60 分钟 * 60 秒 * 8 小时)到时间戳,以便将此时间戳转换为 UTC。这意味着使用许多纪元转换器转换原始导出的时间戳将导致表示时间的偏移量不正确。

示例

1492100624 是来自 mixpanel 的时间戳,它对应于 04/13/2017 @ 4:23pm (Central Time US)。如果我使用Time.at 解析时间戳,它假定时间戳是UTC。

irb(main):001:0> Time.at 1492100624
=> 2017-04-13 11:23:44 -0500
irb(main):002:0> Time.at(1492100624).utc
=> 2017-04-13 16:23:44 UTC .   # correct time in the wrong timezone

根据他们的文档手动添加 7 或 8 小时似乎容易出错,具体取决于时间戳是在夏令时之前还是之后。再说一次,时区令人困惑,所以我可能会比看起来更难!

我应该如何正确读取这些时间戳,以便在 UTC 中对它们进行操作?

注意:我没有使用导轨。我怎样才能在香草 Ruby 中做到这一点?

【问题讨论】:

  • 它是一个 Rails 应用程序还是你用纯红宝石做的?
  • 不是 rails,普通的原版 ruby​​ 脚本 - 添加到问题中。
  • _.utc 在您的示例中为您提供了错误时区的正确时间。
  • 是的,这是我的错误。我提交我的解决方案。希望对你有帮助

标签: ruby timezone mixpanel


【解决方案1】:

这个解决方案似乎对我有用:

t = Time.at 1492100624 // => 2017-04-13 11:23:44 -0500
t -= t.utc_offset      // => 2017-04-13 16:23:44 -0500

【讨论】:

  • 我认为这是你能做的最好的,但重要的是要注意它并不能完全解决问题,因为一些“时区”时间戳可以解析为两个不同的纪元时间戳(特别是在 DST改变)。这就是为什么纪元时间戳被定义为 UTC 的原因:没有那个时间戳作为时间点的唯一标识符是无用的。如果没有任何 Mixpanel 经验,我会认为这是一个错误。
猜你喜欢
  • 2011-09-30
  • 2019-04-29
  • 2021-07-25
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2021-10-21
相关资源
最近更新 更多