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

use*_*833 33 timezone datetime ruby-on-rails ruby-on-rails-3.1

我已经设置了时区/config/application.rb,我希望我的应用程序中生成的所有时间默认都在此时区,但是当我创建一个新DateTime对象(使用.new)时,它会创建它GMT.如何让它在我的应用程序的时区?

/config/application.rb

config.time_zone = 'Pacific Time (US & Canada)'
Run Code Online (Sandbox Code Playgroud)

IRB

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
Run Code Online (Sandbox Code Playgroud)

使用in_time_zone不起作用因为只是将GMT时间转换为PDT时间,这是错误的时间:

irb> mydate.in_time_zone('Pacific Time (US & Canada)')
=> Wed, 11 Jul 2012 13:10:00 PDT -07:00               # wrong time (I want 20:10)
Run Code Online (Sandbox Code Playgroud)

Pet*_*own 31

您可以使用ActiveSupport的TimeWithZone(Time.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 
Run Code Online (Sandbox Code Playgroud)

  • 这实际上不起作用.假设你想在东部时间上午9点创建一个时区.如果你做'2012-07-11 09:00'.to_datetime.in_time_zone('东部时间(美国和加拿大)'),这会给你错误的时间,因为它是从UTC转换的.如果你做'2012-07-11 09:00东部时间(美国和加拿大)'.to_datetime.in_time_zone('东部时间(美国和加拿大)')这仍然不起作用,因为DateTime在白天变得棘手节省时间.最好完全避免使用DateTime.有任何想法吗? (3认同)
  • 这真的很有帮助!但是,如果要在不同于config / application.rb中设置config.time_zone =的区域中创建时间,该怎么办? (2认同)
  • 有一种方法可以在这里完成:http://stackoverflow.com/a/15784181/274695 (2认同)

小智 11

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

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


ewH*_*ewH 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 
Run Code Online (Sandbox Code Playgroud)


Mic*_*gar 5

如果要在不同于设置的本地时区中创建 DateTime 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)
Run Code Online (Sandbox Code Playgroud)