【问题标题】:Convert string to datetime in specific timezone将字符串转换为特定时区的日期时间
【发布时间】:2014-05-23 15:04:25
【问题描述】:

我正在使用 datetimepicker 并且需要将从 params 获得的字符串 datetime 保存到特定的、与用户相关的时区中的 datetime。它将允许我将正确的 UTC 日期时间保存到数据库。

params[:notify_at] #=> "2014-07-05 14:30:00"

user.time_zone #=> #<ActiveSupport::TimeZone:0x00000007535ac8 @name="Warsaw", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Europe/Warsaw>, @current_period=nil>

我想做类似的事情:

date = params[:notify_at].to_datetime(user.time_zone) #=> Sat, 05 Jul 2014 12:30:00 +0000
(its 14:30 in user's localtime but 12:30 in UTC)

【问题讨论】:

    标签: ruby-on-rails ruby datetime time zone


    【解决方案1】:

    您可以使用in_time_zone 方法。例如:

    DateTime.current.in_time_zone("Alaska")
    # => Fri, 23 May 2014 07:21:30 AKDT -08:00
    

    所以对于您的用例:

    params[:notify_at].to_datetime.in_time_zone(user.time_zone)
    

    专业提示:如果使用 Rails v4+,您实际上可以直接在字符串上执行此操作:

    "2014-07-05 14:30:00".in_time_zone("Alaska")
    # => Sat, 05 Jul 2014 14:30:00 AKDT -08:00
    

    更新

    您可以将字符串直接解析到时区(字符串应该已经在该时区中),如下所示:

    Time.zone.parse("2014-07-05 14:30:00")
    # => Sat, 05 Jul 2014 14:30:00 CEST +02:00
    

    所以对于你的用例来说:

    user.time_zone.parse(params[:notify_at])
    

    【讨论】:

    • 已经尝试过这种方式,但这不是我的意思。 to_datetime 将字符串转换为 UTC(因此无论如何它都是 UTC 的 14:30)。调用 in_time_zone('Warsaw') 后,它给了我Sat, 05 Jul 2014 16:30:00 CEST +02:00,这是错误的 - 我需要Sat, 05 Jul 2014 14:30:00 CEST +02:00
    • 是的,就是这样,我自己也想通了,但感谢您的正确答案:)
    【解决方案2】:

    试试这个:-

    date = params[:notify_at].to_datetime.in_time_zone(user.time_zone)
    

    Rails 控制台输出:-

    1.9.3p385 :004 > d= "2014-07-05 14:30:00"
    => "2014-07-05 14:30:00" 
    1.9.3p385 :010 > d.to_datetime.in_time_zone("Pacific Time (US & Canada)")
    => Sat, 05 Jul 2014 07:30:00 PDT -07:00 
    1.9.3p385 :011 > d.to_datetime.in_time_zone("Alaska")
    => Sat, 05 Jul 2014 06:30:00 AKDT -08:00 
    1.9.3p385 :012 > to_datetime.in_time_zone
    

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2020-01-20
      • 2020-01-20
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多