日付を次の形式で表示したい:短い曜日、短い月、先行ゼロなしの日付、ただし「th」、「st」、「nd」、または「rd」のサフィックスを含む。
たとえば、この質問が尋ねられた日は、「10月2日(木)」と表示されます。
Ruby 1.8.7を使用していますが、Time.strftimeはこれを実行していないようです。存在する場合は、標準ライブラリを使用します。
日付を次の形式で表示したい:短い曜日、短い月、先行ゼロなしの日付、ただし「th」、「st」、「nd」、または「rd」のサフィックスを含む。
たとえば、この質問が尋ねられた日は、「10月2日(木)」と表示されます。
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'
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}") }
)
Time::DATE_FORMATS.merge!(:my_date => lambda { |time| time.strftime("%a, %b #{ActiveSupport::Inflector.ordinalize(time.day)}") })
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"
私はバルトシュの答えが好きですが、ねえ、これは私たちが話しているRailsなので、それを一歩先に進んでみましょう。(編集:次の方法を単にモンキーパッチするつもりでしたが、よりクリーンな方法があることがわかりました。)
DateTime
インスタンスにはto_formatted_s
ActiveSupportによって提供されるメソッドがあり、単一のシンボルをパラメーターとして受け取り、そのシンボルが事前定義された有効なフォーマットとして認識された場合、適切なフォーマットの文字列を返します。
これらのシンボルはによって定義されますTime::DATE_FORMATS
。これは、標準のフォーマット関数の文字列またはprocへのシンボルのハッシュです。ブハハハ。
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
フォーマットを作成します。config/initializers/srtftime.rb
module StrftimeOrdinal
def self.included( base )
base.class_eval do
alias_method :old_strftime, :strftime
def strftime( format )
old_strftime format.gsub( "%o", day.ordinalize )
end
end
end
end
[ Time, Date, DateTime ].each{ |c| c.send :include, StrftimeOrdinal }
Time.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"
あなたがこれを使用することができますDate
し、DateTime
同様に:
DateTime.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"
Date.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"
Time
があなたのプロジェクトにパッチを当てましたか?
Jonathan Tranは、最初に省略された曜日、次に省略された月を探していると言っていましたが、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のドキュメントで、カスタム形式の作成方法に関するその他の形式とコンテキストを見つけることができます。