2008-10-03 1 views
163

Ich möchte Daten im Format anzeigen: kurzer Tag der Woche, kurzer Monat, Tag des Monats ohne führende Null, aber einschließlich "th", "st", "nd" oder "rd" Suffix.Wie formatiere ich in Ruby on Rails ein Datum mit dem Suffix "th" wie in "Sun Oct 5th"?

Zum Beispiel würde der Tag, an dem diese Frage gestellt wurde, "Thu Oct 2nd" anzeigen.

Ich benutze Ruby 1.8.7, und Time.strftime scheint einfach nicht zu tun. Ich würde eine Standardbibliothek bevorzugen, wenn eine existiert.

+2

Sie könnten das Wort "Suffix" in Ihrer Frage oder Ihrem Titel verwenden, um dies für andere leichter zu finden. Ich bin nicht sicher, ob es ein anderes Wort dafür gibt, wenn man über Daten spricht. –

+0

Ausgezeichnete Frage. Ich habe erst vor ein paar Tagen über dasselbe nachgedacht - sehr hilfreich. – RichH

Antwort

254

Verwenden Sie die Ordinalize-Methode von 'active_support'.

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

Hinweis, wenn Sie IRB Ruby 2.0 verwenden, müssen Sie zuerst ausführen:

require 'active_support/core_ext/integer/inflections' 
+13

Beachten Sie, dass dies nicht in der Standardbibliothek ist. –

90

Sie können die ordinalize-Hilfsmethode von active_support für Zahlen verwenden.

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

I Bartosz Antwort mögen, aber hey, da dies Rails wir reden Lasst es uns einen Schritt weiter machen. (Edit: Obwohl ich wollte gerade die folgende Methode monkeypatch, stellt sich heraus, ein sauberer Weg.)

DateTime Instanzen haben eine to_formatted_s Methode von Active geliefert, die ein einzelnes Symbol als Parameter annimmt und wenn das Symbol Wird ein gültiges vordefiniertes Format erkannt, wird ein String mit der entsprechenden Formatierung zurückgegeben.

Diese Symbole werden durch definiert, was ein Hash der Symbole für Zeichenfolgen für die Standardformatierungsfunktion ... oder Procs ist. 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 

Aber hey, wenn Sie nicht die Gelegenheit widerstehen können monkeypatch, man kann immer geben, dass eine saubere Schnittstelle:

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 
26

Unter Patrick McKenzie Antwort nur ein bisschen weiter, könnten Sie eine erstellen neue Datei in Ihrem config/initializers Verzeichnis namens date_format.rb (oder was auch immer Sie wollen) und setzt diese in ihm:

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

dann in der Ansicht Code, den Sie ein Format kann ny Datum einfach durch Ihr neues Datumsformat zuweisen:

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

Es ist einfach, es funktioniert, und ist einfach auf zu bauen. Fügen Sie einfach mehr Formatzeilen in die Datei date_format.rb für jedes Ihrer unterschiedlichen Datumsformate ein. Hier ist ein konkreteres Beispiel.

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

Schöne Antwort. Für Rails 3 hat sich ActiveSupport ziemlich verändert, daher ist das folgende Äquivalent: 'Time :: DATE_FORMATS.merge! (: Mein_Datum => Lambda {| time | time.strftime ("% a,% b # {ActiveSupport: : Inflector.ordinalize (Zeit.Tag)} ")})' – Sidane

+1

@Sidane aktualisiert, um das zu reflektieren. – Jonah