Подтвердить что ты не робот

Как создать новый объект DateTime в определенном часовом поясе (предпочтительно часовой пояс по умолчанию для моего приложения, а не UTC)?

Я установил часовой пояс в /config/application.rb, и я ожидаю, что все время, созданное в моем приложении, будет в этом часовом поясе по умолчанию, но когда я создам новый объект DateTime (используя .new), он создает его в GMT. Как я могу получить его в часовом поясе приложения?

/config/application.rb

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

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

Использование 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)
4b9b3361

Ответ 1

Вы можете использовать объект 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 

Ответ 2

Другой способ без синтаксического анализа строк:

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

Ответ 3

Если у меня есть это, я обычно просто указываю utc_offset при создании экземпляра Time.new или DateTime.new.

[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 

Ответ 4

Я делаю следующее в 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

Ответ 5

Этого можно достичь и в классе 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