Как мне работать с Time in Rails? - PullRequest
1 голос
/ 15 июля 2009

Я выдернул свои волосы, пытаясь поработать с Time in Rails. По сути, мне нужно настроить вывод всего времени (как ядра, так и ActiveSupport) на местное время сервера - без GMT, UTC и т. Д. Я видел различные сообщения, относящиеся ко времени, но обычно они касаются чьей-то необходимости устанавливать его для каждый пользователь. Мой не такой сложный, я просто хочу последовательности, когда использую любой объект Time. (Я также был бы признателен за то, что не получал ошибок каждые 3 секунды, сообщая мне, что я не могу преобразовать Fixnum (или другой тип) в строку - это Ruby, просто сделайте это!)

Мне также кажется, что время для Time.new резко отличается от ActiveSupport 1.second.ago. В любом случае, есть ли у кого-нибудь какие-либо предложения по качеству работы с Time in Rails?

Ответы [ 5 ]

1 голос
/ 16 июля 2009

Где-нибудь в ваших инициализаторах определите формат (ы), который вы хотите использовать.

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:default => '%m/%d/%Y %H:%M')
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:my_special_format => '%H:%M %p')

Затем, когда вы хотите напечатать объект Time, он работает как в следующем примере. Обратите внимание, что объект Time в моей консоли уже знает мой часовой пояс. Я не выполняю здесь никаких магических преобразований.

>> t = Time.now
=> Wed Jul 15 18:47:33 -0500 2009
>> t.to_s
=> "07/15/2009 18:47"
>> t.to_s(:my_special_format)
=> "18:47 PM"

Время вызова # to_s использует формат: default, или вы можете передать имя формата, который вы предпочитаете использовать, как я сделал с: my_special_format.

Здесь вы можете увидеть различные варианты форматирования объекта Time .

1 голос
/ 15 июля 2009

Если вы просто хотите, чтобы объекты Time были согласованными, то почему бы не придерживаться UTC? Я только что попробовал Time.new и 1.second.ago, используя скрипт / консоль, и я получил тот же вывод (дать или взять секунду для ввода команды). Как дела?

0 голосов
/ 04 января 2011

Быстрое дополнение к решению DATE_FORMAT, опубликованное выше. Ваш формат может быть строкой, и в этом случае он работает, как указано выше, вызывая strftime, но вы также можете определить формат как лямбда:

CoreExtensions::Time::Conversions::DATE_FORMATS.merge! :my_complex_format => lambda {|time|
   # your code goes here
}
0 голосов
/ 07 декабря 2009

Добавьте следующее к config/environment.rb, чтобы правильно и последовательно обрабатывать время в контексте Rails. Важно знать, что он будет хранить ваше время в базе данных в формате UTC - но это то, что вам нужно - все преобразования выполняются автоматически.

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

Вы можете запустить rake time:zones:local из корневого каталога Rails, чтобы получить список допустимых строк часового пояса в вашем регионе.

0 голосов
/ 16 июля 2009

Если вы не хотите сохранять настройку времени каждого пользователя, единственное решение - использовать систему времени javascript, потому что она работает на времени клиента пользователя. Например, у меня есть приложение, которое каждый раз, когда пользователь пробует его, приложение создает некоторые примеры данных, у каждого из которых есть начальное значение даты "сегодня". Поначалу меня это сильно смущает, потому что мой хост-сервер находится в Австралии, а большая часть пользователей находится в западной части, поэтому иногда начальное значение даты не «сегодня», а «вчера» из-за другого региона времени.

После нескольких дней головной боли я, наконец, принял решение ПРОСТО использовать систему времени javascript и включить ее в ссылку, поэтому, когда пользователь нажимает ссылку «попробовать сейчас», она также включает значение даты сегодня.

<% javascript_tag do -%>
  var today = new Date();
  $("trynow").href = "<%= new_invitation_path %>?today=" + today.toLocaleString();
<% end -%>
...