Ruby on Railsでは、「日10月5日」のように、「th」という接尾辞で日付をどのようにフォーマットしますか?


177

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

たとえば、この質問が尋ねられた日は、「10月2日(木)」と表示されます。

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


2
質問やタイトルで「サフィックス」という単語を使用すると、他の人がこれを見つけやすくなります。日付について話すときに、これについて別の言葉があるかどうかはわかりません。
Harley Holcombe

すばらしい質問です。ほんの数日前に私は同じことを考えていました-非常に役に立ちました。
RichH 2008年

回答:


278

'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'

15
これは標準ライブラリにはないことに注意してください。
Chris Lloyd

97

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

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

30

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

7
素敵な答え。レール3は、activesupportのは、以下が等価であるので、かなり変化している:Time::DATE_FORMATS.merge!(:my_date => lambda { |time| time.strftime("%a, %b #{ActiveSupport::Inflector.ordinalize(time.day)}") })
Sidane

9
>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"

6

私はバルトシュの答えが好きですが、ねえ、これは私たちが話しているRailsなので、それを一歩先に進んでみましょう。(編集:次の方法を単にモンキーパッチするつもりでしたが、よりクリーンな方法があることがわかりました。)

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

これらのシンボルはによって定義されます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

3

独自の%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"

これが文書化されているかどうかは不明です。私はそれのレコードを見つけることができないようですが、私たちはそれをコードベースで使用しているので、どこかでそれを見つけたはずです。
ジョシュア・ピンター

1
これを2.6.3で動作させることはできません。たぶんそれはRubyの古いバージョンにありましたか?それとも誰かTimeがあなたのプロジェクトにパッチを当てましたか?
kcdragon

2
@kcdragonうわー、あなたは絶対に正しかった。コードベースを検索したところ、私の古い仲間のChuck Bergeronがこの初期化子を7年近く前に追加したことがわかりました。いずれにしても、これは非常に便利だと思うので、CNTRALのように実装する方法で回答を更新しました。
Joshua Pinter

2

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のドキュメントで、カスタム形式の作成方法に関するその他の形式とコンテキストを見つけることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.