ruby-on-rails - zone - using date in ruby




Em Ruby on Rails, como formatar uma data com o sufixo “th”, como em “Sun Oct 5th”? (5)

Desejo exibir datas no formato: dia curto da semana, mês curto, dia do mês sem zero, mas incluindo o sufixo "th", "st", "nd" ou "rd".

Por exemplo, o dia em que esta pergunta foi feita exibiria "Qui Out 2nd".

Estou usando o Ruby 1.8.7 e o Time.strftime simplesmente não parece fazer isso. Eu preferiria uma biblioteca padrão, se existir.


Use %o .

Time.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

Cuidado: você não pode usar isso com o DateTime :

DateTime.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct %o"

Mas, você deve estar usando o Time qualquer maneira e esta é uma boa razão para fazer a troca.


Embora Jonathan Tran tenha dito que ele estava procurando o primeiro dia abreviado da semana, seguido pelo mês abreviado, acho que pode ser útil para as pessoas que acabarem sabendo que o Rails tem suporte pronto para o uso mais mês longo comumente utilizável, inteiro dia ordinalizado, seguido do ano, como em June 1st, 2018 .

Pode ser facilmente alcançado com:

Time.current.to_date.to_s(:long_ordinal)
=> "January 26th, 2019"

Ou:

Date.current.to_s(:long_ordinal)
=> "January 26th, 2019"

Você pode se ater a uma instância de tempo, se desejar também:

Time.current.to_s(:long_ordinal)
=> "January 26th, 2019 04:21"

Você pode encontrar mais formatos e contexto sobre como criar um personalizado nos documentos da API do Rails .


Levando um pouco mais longe a resposta de Patrick McKenzie, você poderia criar um novo arquivo no seu diretório config/initializers chamado date_format.rb (ou o que você quiser) e colocar isso nele:

Time::DATE_FORMATS.merge!(
  my_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") }
)

Em seguida, no seu código de visualização, você pode formatar qualquer data simplesmente atribuindo a ela o novo formato de data:

My Date: <%= h some_date.to_s(:my_date) %>

É simples, funciona e é fácil de construir. Basta adicionar mais linhas de formato no arquivo date_format.rb para cada um dos seus diferentes formatos de data. Aqui está um exemplo mais detalhado.

Time::DATE_FORMATS.merge!(
   datetime_military: '%Y-%m-%d %H:%M',
   datetime:          '%Y-%m-%d %I:%M%P',
   time:              '%I:%M%P',
   time_military:     '%H:%M%P',
   datetime_short:    '%m/%d %I:%M',
   due_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") }
)

Use o método ordinalize em 'active_support'.

>> time = Time.new
=> Fri Oct 03 01:24:48 +0100 2008
>> time.strftime("%a %b #{time.day.ordinalize}")
=> "Fri Oct 3rd"

Note, se você estiver usando o IRB com o Ruby 2.0, você deve primeiro executar:

require 'active_support/core_ext/integer/inflections'

>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"




date