【问题标题】:Create a Time object from a timezone and date and time?从时区和日期和时间创建一个时间对象?
【发布时间】:2017-04-04 10:35:10
【问题描述】:

我很尴尬(也很震惊)我无法在 SO 或 google 上找到一个好的答案,如果有的话,请随时给我指出一个 dup,但是......

我想要一个像这样工作的函数(理想情况下是纯 ruby​​,但 active_support 解决方案还可以):

输入:某种合理格式的日期时间字符串(例如,2016-12-25 12:00)和时区。 不是一个偏移量,而是一个时区,例如America/ChicagoAmerica/New_York)。例如,

make_time_in_zone('2016-12-25 12:00', 'America/Chicago')

输出:代表该确切时间点的 TimeDateTime 对象。也就是说,该函数应该使用时区来计算偏移量和夏令时调整,以便您可以知道,例如,America/Chicago 圣诞节正午时的 UTC 时间。

我知道我可以将时区设置为所需的时区,创建Time 对象,然后将时区设置回系统时区,但我认为这是一个不可接受的解决方案,并且想要一个实际支持的功能这个用例。

【问题讨论】:

  • 看看这是否对你有用:stackoverflow.com/questions/34175813/…
  • 不完全。 in_time_zone 做另一个方向:取一个确切的时间点,并告诉你它在某个时区的日期和时间。四舍五入到午夜并添加技巧也不总是有效,(至少在一般情况下),因为根据区域和时间,in_time_zone 可以让你前进后退一天
  • 仍然不清楚你想要什么。 “......这样你就可以知道,例如,在美国/芝加哥的圣诞节中午几点钟”。你的意思是在UTC?因为在美国/芝加哥的圣诞节中午是中午。不是要成为一个聪明的驴子,真的不明白你想要什么。
  • "你的意思是 UTC 吗?" - 实际上,是的,这就是我要问的。我给你一个日期、时间和区域,你给我一个 UTC 时间戳。我只是在转换为 ruby​​ Time 对象方面对其进行了介绍,但它是一回事。
  • in_time_zone 也会使您向后或向前移动一天,因为这是时区的工作方式。西雅图的 21:00 是格林威治的 05:00。但在西雅图是 11/20,在格林威治是 11/21。所以不清楚你说的向后或向前一天是什么意思。

标签: ruby-on-rails ruby


【解决方案1】:

只需使用in_time_zone 解析时区中的日期。您可以将时区作为参数传递。

in_time_zone(zone = ::Time.zone)

这将完全返回您想要的。

'2016-12-25 12:00'.in_time_zone('America/Chicago')
#=> Sun, 25 Dec 2016 12:00:00 CST -06:00

'2016-12-25 12:00'.in_time_zone('America/New_York')
#=> Sun, 25 Dec 2016 12:00:00 EST -05:00

【讨论】:

    【解决方案2】:

    Rails 将当前区域存储在当前线程中,因此最正确的方法是设置一个区域进行解析。像

    Time.use_zone('America/Chicago') { Time.zone.parse('2016-12-25 12:00')}
    

    还有更“hackish”的方式,但不是来自公共 API。

    ActiveSupport::TimeZone['America/Chicago'].parse('2016-12-25 12:00')
    

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多