次の形式で日付を表示したい:短い曜日、短い月、先頭にゼロを付けず、「th」、「st」、「nd」、または「rd」サフィックスを含む日。
たとえば、この質問が行われた日には、「Thu Oct 2nd」と表示されます。
Ruby 1.8.7、および Time.strftime を使用していないようです。存在する場合は標準ライブラリを使用したいと思います。
'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'
数値に対してactive_supportのordinalizeヘルパーメソッドを使用できます。
>> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"
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}") }
)
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"
私は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
%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
を使用する必要があり、これが切り替えを行う正当な理由です。
ジョナサントランは、最初に短縮された曜日を、次に短縮された月を探していると言っていましたが、ここにたどり着いた人にとっては、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ドキュメント で、カスタム形式の作成方法に関する他の形式とコンテキストを見つけることができます。