web-dev-qa-db-ja.com

Ruby on Railsで、 "Sun Oct 5th"のように、 "th"サフィックスで日付をフォーマットするにはどうすればよいですか?

次の形式で日付を表示したい:短い曜日、短い月、先頭にゼロを付けず、「th」、「st」、「nd」、または「rd」サフィックスを含む日。

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

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

172
Jonathan Tran

'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'
272
Bartosz Blimke

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

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

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

私はBartoszの答えが好きですが、これはRailsについて話しているので、もう少し上手にそれを取り上げましょう。よりクリーンな方法があることがわかります。)

DateTimeインスタンスには、ActiveSupportが提供するto_formatted_sメソッドがあります。このメソッドは、単一のシンボルをパラメーターとして受け取り、そのシンボルが有効な事前定義フォーマットとして認識されると、適切なフォーマットのストリングを返します。

これらのシンボルは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
6

つかいます %o

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

注意:DateTimeでこれを使用することはできません:

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

ただし、とにかくTimeを使用する必要があり、これが切り替えを行う正当な理由です。

2
Joshua Pinter

ジョナサントランは、最初に短縮された曜日を、次に短縮された月を探していると言っていましたが、ここにたどり着いた人にとっては、Rails June 1st, 2018のように、より一般的に使用される長い月、序数化された日整数、その​​後に年がサポートされます。

次の方法で簡単に実現できます。

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

または:

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

必要に応じて、時間インスタンスに固執することもできます。

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

Rails APIドキュメント で、カスタム形式の作成方法に関する他の形式とコンテキストを見つけることができます。

1
Olivier Lacan