Ruby on Rails - как отобразить дату в нужном мне формате? Преобразование из ГГГГ-ММ-ДД ЧЧ: ММ: СС UTC в ММ / ДД / ГГГГ - PullRequest
18 голосов
/ 20 апреля 2009

Я новичок в RoR. Я много чего перепробовал, наконец пришел к следующему:

<td>
 <%= Date.strptime(request.baseline_start_date, "%Y-%M-%D %H:%M:%S %Z").strftime("%M/%D/%Y")%>
</td>

Но это также дает мне ошибку:

$_ value need to be String (nil given)

Но я знаю, что request.baseline_start_date дает мне значение (попытался распечатать его отдельно). Я не знаю, что он говорит, как ноль дано.

Любые предложения о том, как я могу добиться преобразования формата?

Ответы [ 7 ]

31 голосов
/ 18 октября 2012

В Rails вы можете использовать функцию to_time для строки, чтобы преобразовать ее в объект Date:

'2012-11-14 14:27:46'.to_time.strftime('%B %e at %l:%M %p')

#=> "November 14 at 2:27 PM"

Для удобного интерактивного справочного руководства см. http://www.foragoodstrftime.com/

27 голосов
/ 24 апреля 2009
Date.strptime(
  "2009-04-24 18:33:41 UTC",
  "%Y-%m-%d %H:%M:%S %Z"
).strftime("%m/%d/%Y")
# => "04/24/2009"

Я думаю, что, возможно, вы неправильно указали заглавные буквы в строках формата.

14 голосов
/ 18 октября 2012

Проверьте документацию и примеры активной поддержки по адресу: http://apidock.com/rails/ActiveSupport/CoreExtensions/DateTime/Conversions/to_formatted_s

Примеры

datetime = DateTime.civil(2007, 12, 4, 0, 0, 0, 0)   # => Tue, 04 Dec 2007 00:00:00 +0000

datetime.to_formatted_s(:db)            # => "2007-12-04 00:00:00"
datetime.to_s(:db)                      # => "2007-12-04 00:00:00"
datetime.to_s(:number)                  # => "20071204000000"
datetime.to_formatted_s(:short)         # => "04 Dec 00:00"
datetime.to_formatted_s(:long)          # => "December 04, 2007 00:00"
datetime.to_formatted_s(:long_ordinal)  # => "December 4th, 2007 00:00"
datetime.to_formatted_s(:rfc822)        # => "Tue, 04 Dec 2007 00:00:00 +0000"

Или, если вы действительно хотите настроить его, определите помощника следующим образом:

def custom_format(time)
  Time::DATE_FORMATS[:w3cdtf] = lambda { |time| time.strftime("%Y-%m-%dT%H:%M:%S# {time.formatted_offset}") }
end
3 голосов
/ 28 декабря 2009

Я написал действительно хороший драгоценный камень, который упрощает весь процесс и делает форматирование даты СУХИМ.

Проверьте это по адресу: http://github.com/platform45/easy_dates

3 голосов
/ 22 апреля 2009

Вы можете использовать функцию String # to_time (или Date # to_time) в ActiveSupport для преобразования строки в объект Time (или Date). Затем используйте strftime, как вы уже сделали.

1 голос
/ 20 апреля 2009

Что я сделал, это добавил инициализатор с именем conversions.rb в config / initializer После этого добавьте строку следующим образом:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.update(:<name> => '<formatting>')

С этого момента вы можете отображать дату и время в вашем формате:

dateVar.to_s(:<name>)

Здесь есть удобный список здесь токенов форматирования

0 голосов
/ 20 апреля 2009

Большое спасибо за ответ. Моя проблема в том, что вывод, кажется, уже строка, и мне нужно преобразовать дату в строку в другой формат.

Когда я смотрю на дату, хранящуюся в базе данных (Oracle), это мм / дд / гг, но когда я ее отображаю, добавляются метка времени и часовой пояс.

Я попытался установить значение по умолчанию в Configuration \ environment.rb как ActiveSupport :: CoreExtensions :: Дата :: Конверсия :: DATE_FORMATS.merge! ( : default => '% d% b% Y' ) Но это также, похоже, не помогает.

В конце, если я просто получу строку для преобразования из формата Timezone в mm / dd / yyyy, этого достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...