Как преобразовать postgres UTC в другой часовой пояс?

Есть ли способ преобразовать время UTC postgres в часовой пояс пользователя или, по крайней мере, восточное стандартное время (я был бы признателен за любой ответ)?

Я думал, что есть способ изменить время UTC postgres, но я не не думаю, что это не вызывает много вопросов. Из того, что я прочитал, было бы лучше использовать код во внешнем интерфейсе, который преобразовал бы его в правильный часовой пояс?

Это едва ли имеет для меня смысл.

В чем смысл?

Таким образом, когда пользователь отмечает, что он выполнил хорошую привычку, привычка исчезает и должна снова появиться завтра в 12:00, но в конечном итоге привычки снова появятся позже в тот же день из-за UTC.

habit.rb

scope :incomplete, -> {where("completed_at is null OR completed_at < ?", Date.today)} # aka those habits not completed today will be shown

def completed=(boolean)
  self.completed_at = boolean ? Time.current : nil
end

def completed
  completed_at && completed_at >= Time.current.beginning_of_day
end

person AnthonyGalli.com    schedule 26.07.2015    source источник
comment
поэтому, если вы добавите этот config.time_zone = 'Eastern Time (US & Canada)' в свой application.rb и в свою консоль, если вы сделаете Habit.last.completed_at, он вернет время UTC или восточное время.?   -  person Athar    schedule 26.07.2015
comment
config.time_zone позволяет вам получить доступ к вашему времени в определенном часовом поясе, используя Time.zone.now или Time.zone.beginning_of_day. если вы немного измените свою область и добавите config.time_zone = 'Eastern Time (US & Canada)' в свой application.rb, вы добьетесь того, чего хотите   -  person Athar    schedule 26.07.2015
comment
У меня уже есть эта строка @Athar в моем application.rb: stackoverflow.com/questions/31639288/   -  person AnthonyGalli.com    schedule 26.07.2015
comment
хорошо, вы попробовали это Habit.last.completed_at, что оно возвращает. также измените область действия следующим образом scope :incomplete, -> {where("completed_at is null OR completed_at < ?", Time.zone.now.beginning_of_day)}   -  person Athar    schedule 26.07.2015
comment
Это возвращает: Sun, 26 Jul 2015 12:20:13 EDT -04:00 Это работает в разработке @Athar. Я попробую этот объем.   -  person AnthonyGalli.com    schedule 26.07.2015
comment
хорошо, что, если вы попробуете это Habit.last.completed_at в консоли героку.? что это возвращает.?   -  person Athar    schedule 26.07.2015
comment
Дает: вс, 26 июля 2015 г., 14:10:46 по восточному поясному времени -04:00.   -  person AnthonyGalli.com    schedule 26.07.2015
comment
Давайте продолжим это обсуждение в чате.   -  person Athar    schedule 26.07.2015


Ответы (2)


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

scope :incomplete, -> {where("completed_at is null OR completed_at < ?", Time.zone.now.beginning_of_day)}
person Athar    schedule 26.07.2015
comment
Эй, это не сработало для меня, но ответ в ваших комментариях сработал: scope :incomplete, -> {where("completed_at is null OR completed_at < ?", Time.zone.now.beginning_of_day)} Еще раз спасибо :] - person AnthonyGalli.com; 27.07.2015

Поместите этот фрагмент кода в ваш application.rb

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

и запустите его, чтобы он был установлен на героку heroku config:add TZ=America/Los_Angeles.

Как правило, вы также можете использовать #in_time_zone. Всегда используйте время, подобное Time.zone.now.

Time.utc(2000).in_time_zone('Alaska') # => Fri, 31 Dec 1999 15:00:00 AKST -09:00
DateTime.utc(2000).in_time_zone('Alaska') # => Fri, 31 Dec 1999 15:00:00 AKST -09:00
Date.new(2000).in_time_zone('Alaska')  # => Sat, 01 Jan 2000 00:00:00 AKST -09:00

дата и часовые пояса

документация API

person adamliesko    schedule 26.07.2015
comment
Спасибо Адам! У меня это уже есть в моем application.rb, и я выполнил эту команду: stackoverflow.com/questions/31639288/ - person AnthonyGalli.com; 26.07.2015