it-swarm.com.de

Wie formatiere ich in Ruby on Rails ein Datum mit dem Suffix "th", z.

Ich möchte Datumsangaben im Format anzeigen: kurzer Wochentag, kurzer Monat, Tag des Monats ohne führende Null, jedoch mit dem Zusatz "th", "st", "nd" oder "rd".

Beispielsweise würde der Tag, an dem diese Frage gestellt wurde, "Do Oct 02" anzeigen.

Ich verwende Ruby 1.8.7 und Time.strftime scheint dies einfach nicht zu tun. Ich würde eine Standardbibliothek vorziehen, wenn eine vorhanden ist.

168
Jonathan Tran

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"

Wenn Sie IRB mit Ruby 2.0 verwenden, müssen Sie zuerst Folgendes ausführen:

require 'active_support/core_ext/integer/inflections'
266
Bartosz Blimke

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

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

Um Patrick McKenzies Antwort etwas weiter auszudrücken, könnten Sie in Ihrem config/initializers-Verzeichnis eine neue Datei mit dem Namen date_format.rb (oder wie immer Sie möchten) erstellen und diese in das Verzeichnis einfügen:

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

Dann können Sie in Ihrem Ansichtscode ein beliebiges Datum formatieren, indem Sie ihm Ihr neues Datumsformat zuweisen:

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

Es ist einfach, es funktioniert und lässt sich leicht aufbauen. Fügen Sie einfach weitere Formatzeilen in der date_format.rb-Datei für jedes Ihrer unterschiedlichen Datumsformate hinzu. Hier ist ein ausführlicheres 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}") }
)
29
Richard Hurt
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"
9
Jimmy Schementi

Ich mag die Antwort von Bartosz, aber hey, da wir hier von Rails sprechen, nehmen wir es einen Schritt weiter. (Edit: Obwohl ich einfach die folgende Methode monkeypatchen wollte, stellt sich heraus, dass es sauberer ist.)

DateTime-Instanzen verfügen über eine to_formatted_s-Methode, die von ActiveSupport bereitgestellt wird. Dabei wird ein einzelnes Symbol als Parameter verwendet. Wenn dieses Symbol als gültiges vordefiniertes Format erkannt wird, wird ein String mit der entsprechenden Formatierung zurückgegeben. 

Diese Symbole werden durch Time::DATE_FORMATS definiert. Hierbei handelt es sich um einen Hash von Symbolen für Strings für die Standardformatierungsfunktion ... oder für 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

Aber hey, wenn Sie der Gelegenheit zum Monkeypatch nicht widerstehen können, könnten Sie diesem immer ein saubereres Interface geben:

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
6

Verwenden Sie %o.

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

Achtung: Dies kann nicht mit DateTime verwendet werden:

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

Sie sollten jedoch Time trotzdem verwenden, und dies ist ein guter Grund, die Umstellung vorzunehmen.

2
Joshua Pinter

Obwohl Jonathan Tran gesagt hat, dass er zuerst nach dem abgekürzten Wochentag und danach nach dem verkürzten Monat suchte, könnte es meiner Meinung nach für Leute nützlich sein, die hier landen, um zu wissen, dass Rails mehr Unterstützung bietet allgemein verwendbarer langer Monat, ordinalisierte Ganzzahl, gefolgt von dem Jahr, wie in June 1st, 2018.

Es kann leicht erreicht werden mit:

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

Oder:

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

Sie können sich auch an eine Zeitinstanz halten, wenn Sie möchten:

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

Weitere Formate und Kontexte zum Erstellen eines benutzerdefinierten Formats finden Sie in den Rails-API-Dokumenten .

1
Olivier Lacan