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.

    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' 

    Vous pouvez utiliser la méthode d’assistance ordinale sur les nombres.

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

    En prenant la réponse de Pasortingck McKenzie un peu plus loin, vous pourriez créer un nouveau fichier dans votre répertoire config/initializers appelé date_format.rb (ou ce que vous voulez) et y mettre:

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

    Ensuite, dans votre code de vue, vous pouvez formater n’importe quelle date simplement en lui atsortingbuant votre nouveau format de date:

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

    C’est simple, ça marche et c’est facile à construire. Ajoutez simplement plus de lignes de format dans le fichier date_format.rb pour chacun de vos différents formats de date. Voici un exemple plus détaillé.

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

    J’aime la réponse de Bartosz, mais bon, puisque nous parlons de Rails, passons à la vitesse supérieure. (Edit: Bien que j’allais à monkeypatch la méthode suivante, il s’avère qu’il existe une méthode plus propre.)

    DateTime instances DateTime ont une méthode to_formatted_s fournie par ActiveSupport, qui prend un seul symbole comme paramètre et, si ce symbole est reconnu comme format prédéfini valide, renvoie une chaîne avec la mise en forme appropriée.

    Ces symboles sont définis par Time::DATE_FORMATS , qui est un hachage de symboles pour les chaînes de caractères de la fonction de formatage standard … 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’opportunité de faire du monkeypatch, vous pouvez toujours lui donner une interface plus propre:

     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