188

日付を次の形式で表示したい: 短い曜日、短い月、日付の先頭に 0 を付けず、"th"、"st"、"nd"、または "rd" の接尾辞を含む。

たとえば、この質問が行われた日は「Thu Oct 2nd」と表示されます。

私はRuby 1.8.7を使用しています.Time.strftimeはこれをしていないようです. 標準ライブラリが存在する場合は、標準ライブラリを使用したいと思います。

4

7 に答える 7

292

「active_support」の ordinalize メソッドを使用します。

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

Ruby 2.0 で IRB を使用している場合は、最初に次を実行する必要があります。

require 'active_support/core_ext/integer/inflections'
于 2008-10-03T00:25:37.660 に答える
107

数値に対して、active_support の ordinalize ヘルパー メソッドを使用できます。

>> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"
于 2008-10-03T00:21:31.430 に答える
32

Patrick McKenzie の回答をもう少し進めると、(または任意の)config/initializersという名前の新しいファイルをディレクトリに作成し、これをその中に入れることができます。date_format.rb

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

次に、ビュー コードで新しい日付形式を割り当てるだけで、任意の日付を書式設定できます。

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

シンプルで機能し、簡単に構築できます。異なる日付フォーマットごとに、date_format.rb ファイルにフォーマット行を追加するだけです。これは、より肉付けされた例です。

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}") }
)
于 2009-01-11T16:10:30.970 に答える
10
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"
于 2008-10-03T00:29:53.640 に答える
6

私は Bartosz の答えが好きですが、これは私たちが話している Rails であるため、よこしまな一歩を踏み出しましょう。(編集:次の方法をモンキーパッチするだけでしたが、よりクリーンな方法があることがわかりました。)

DateTimeインスタンスにはto_formatted_sActiveSupport が提供するメソッドがあり、単一のシンボルをパラメーターとして取り、そのシンボルが有効な事前定義された形式として認識された場合、適切な形式の文字列を返します。

これらのシンボルはTime::DATE_FORMATS、標準の書式設定関数の文字列または procs へのシンボルのハッシュである によって定義されます。ブワハハ。

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

でもねえ、モンキーパッチをする機会に抵抗できないなら、いつでもよりクリーンなインターフェースを与えることができます:

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
于 2008-10-03T01:37:38.347 に答える