Вопрос по ruby-on-rails, datetime, ruby-on-rails-3.1, timezone – Как создать новый объект DateTime в определенном часовом поясе (предпочтительно часовой пояс по умолчанию для моего приложения, а не в формате UTC)?

32

Я установил часовой пояс в/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 не работает, потому что это просто преобразует время по Гринвичу во время ФДТ, что является неправильным временем:

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)

Ваш Ответ

4   ответа
0

чтобы установить часовой пояс для времени пользователя.

Я не уверен, что это то, что вы хотите.

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
Это не то, что я искал, но спасибо за публикацию .. возможно, это будет полезно для кого-то еще. user664833
10

Еще один способ без разбора строки:

irb> Time.zone.local(2012, 7, 11, 21)
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00
Аргументы отличаются отDatTime.new метод. Time.zone.local не принимает 0 или -1 в качестве аргументов и выдаст аргумент вне диапазона ошибок.
31

Вы можете использовать ActiveSupportTimeWithZone (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 
Есть способ сделать это здесь:stackoverflow.com/a/15784181/274695
Я бы использовал что-то вроде'2012-07-11 21:00'.to_datetime.in_time_zone('Eastern Time (US & Canada)')
Это действительно полезно! Но что, если вы хотите создать время в зоне, отличной от той, которую вы установили в config.time_zone = в config / application.rb?
это на самом деле не работает. Допустим, вы хотите создать время в зоне для 9 утра по восточному. если вы сделаете «2012-07-11 09: 00» .to_datetime.in_time_zone («Восточное время (США и Канада)»), это вернет вам неправильное время, потому что оно конвертируется из UTC. если вы выполняете «2012-07-11 09:00 по восточному времени (США и Канада)» .to_datetime.in_time_zone («восточное время (США и Канада)») это все равно не работает, поскольку DateTime является Отвратительно, когда дело доходит до летнего времени. Лучше всего избегать DateTime полностью. Есть идеи?
6

Если он у меня есть, я обычно просто указываю 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 

Похожие вопросы