189 votes

Dans Ruby on Rails, comment formater une date avec le suffixe "th", comme dans "Sun Oct 5"?

Je veux afficher les dates dans le format: court jour de la semaine, mois court, jour du mois sans zéro, mais avec le suffixe "th", "st", "nd" ou "rd".

Par exemple, le jour où cette question a été posée affichera "Jeudi 2 octobre".

J'utilise Ruby 1.8.7 et Time.strftime ne semble pas le faire. Je préférerais une bibliothèque standard si elle existe.

293voto

Bartosz Blimke Points 2930

Utilisez la méthode ordinalize de 'active_support'.

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

Remarque: si vous utilisez IRB avec Ruby 2.0, vous devez d'abord exécuter:

 require 'active_support/core_ext/integer/inflections'
 

107voto

mwilliams Points 6748

Vous pouvez utiliser la méthode d'assistance ordinale de active_support sur les nombres.

 >> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"
 

32voto

Richard Hurt Points 985

La prise de Patrick McKenzie réponse un peu plus loin, vous pouvez créer un nouveau fichier dans votre config/initializers - répertoire date_format.rb (ou ce que vous voulez) et de mettre ça:

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

Ensuite, dans votre code, vous pouvez formater une date simplement en confiant votre nouveau format de la date:

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

C'est simple, ça fonctionne, et est facile à construire. Ajoutez simplement plus de format de lignes dans le date_format.rb fichier pour chacun de vos différents formats de date. Ici, c'est un plus étoffé exemple.

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}") }
)

11voto

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

6voto

Patrick McKenzie Points 3158

J'aime Bartosz réponse, mais bon, puisque c'est sur les Rails, nous parlons, nous allons franchir une étape dans sournois. (Edit: Bien que j'allais juste monkeypatch la méthode suivante, il s'avère qu'il est le moyen le plus propre.)

DateTime des cas ont un to_formatted_s méthode fournie par ActiveSupport, qui prend un seul symbole en tant que paramètre et, si ce symbole est reconnu comme valide d'un format prédéfini, retourne une Chaîne de caractères avec la mise en forme appropriées.

Ces symboles sont définis par Time::DATE_FORMATS, ce qui est un hachage de symboles en forme de chaînes pour la mise en forme standard de la fonction... ou procs. Bwahaha.

d = DateTime.now #Examples were executed on October 3rd 2008
Time::DATE_FORMATS[:weekday_month_ordinal] = 
    lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") }
d.to_formatted_s :weekday_month_ordinal #Fri Oct 3rd

Mais bon, si vous ne pouvez pas résister à l'occasion de monkeypatch, vous pouvez toujours donner qu'une interface épurée:

class DateTime

  Time::DATE_FORMATS[:weekday_month_ordinal] = 
      lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") }

  def to_my_special_s
    to_formatted_s :weekday_month_ordinal
  end
end

DateTime.now.to_my_special_s  #Fri Oct 3rd

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X