如何在特定时区创建新的DateTime对象(最好是我的应用程序的默认时区,而不是UTC)?

时间:2012-07-12 02:12:26

标签: ruby-on-rails datetime ruby-on-rails-3.1 timezone

我已将时区设置为/config/application.rb,我希望我的应用中生成的所有时间默认位于此时区,但是当我创建新的DateTime对象时(使用{{ 1}}),它在.new中创建它。如何让它在我的应用程序的时区?

/config/application.rb

GMT

IRB

config.time_zone = 'Pacific Time (US & Canada)'

使用irb> DateTime.now => Wed, 11 Jul 2012 19:04:56 -0700 irb> mydate = DateTime.new(2012, 07, 11, 20, 10, 0) => Wed, 11 Jul 2012 20:10:00 +0000 # GMT, but I want PDT 不起作用,因为这只是将GMT时间转换为PDT时间,这是错误的时间:

in_time_zone

6 个答案:

答案 0 :(得分:31)

您可以使用ActiveSupport的TimeWithZoneTime.zone)对象在应用程序的时区中创建和解析日期:

1.9.3p0 :001 > Time.zone.now
 => Wed, 11 Jul 2012 19:47:03 PDT -07:00 
1.9.3p0 :002 > Time.zone.parse('2012-07-11 21:00')
 => Wed, 11 Jul 2012 21:00:00 PDT -07:00 

答案 1 :(得分:11)

没有字符串解析的另一种方法:

irb> Time.zone.local(2012, 7, 11, 21)
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00

答案 2 :(得分:6)

如果我拥有它,我通常只在实例化Time.new或DateTime.new时指定utc_offset。

[1] pry(main)> Time.new(2013,01,06, 11, 25, 00) #no specified utc_offset defaults to system time
 => 2013-01-06 11:25:00 -0500
[2] pry(main)> Time.new(2013,01,06, 11, 25, 00, "+00:00") #UTC
 => 2013-01-06 11:25:00 +0000
[3] pry(main)> Time.new(2013,01,06, 11, 25, 00, "-08:00") #PST
 => 2013-01-06 11:25:00 -0800 

答案 3 :(得分:4)

如果要在与设置为config.time_zone的本地时区不同的本地时区创建日期时间:

la_date = ActiveSupport::TimeZone["America/Los_Angeles"].parse('2020-02-01')
DateTime.new(la_date.year, la_date.month, la_date.day, la_date.hour, la_date.min, la_date.sec, la_date.zone)

答案 4 :(得分:1)

这也可以在DateTime类中通过添加时区来实现。

2.5.1 :001 > require 'rails'
 => true
2.5.1 :002 > mydate = DateTime.new(2012, 07, 11, 20, 10, 0)
 => Wed, 11 Jul 2012 20:10:00 +0000
2.5.1 :003 > mydate = DateTime.new(2012, 07, 11, 20, 10, 0, "PST")
 => Wed, 11 Jul 2012 20:10:00 -0800

https://docs.ruby-lang.org/en/2.6.0/DateTime.html

2.6.0 :001 > DateTime.new(2012, 07, 11, 20, 10, 0, "-06")
 => Wed, 11 Jul 2012 20:10:00 -0600
2.6.0 :002 > DateTime.new(2012, 07, 11, 20, 10, 0, "-05")
 => Wed, 11 Jul 2012 20:10:00 -0500

答案 5 :(得分:0)

我在ApplicationController中执行以下操作,将时区设置为用户的时间。

我不确定这是不是你想要的。

class ApplicationController < ActionController::Base
  before_filter :set_timezone
  def set_timezone
    # current_user.time_zone #=> 'London'
    Time.zone = current_user.time_zone if current_user && current_user.time_zone
  end

end