2012-06-18 13 views

答えて

26

Easiest is to use strftime (docs)

ビュー側で使用する場合は、ヘルパーでラップしてください。

+1

私はそれを使用する方法を見つけませんでした。あなたに私に小さな事例を教えてもらえますか? – Alexandre

+6

my_date_variable.strftime( "%m /%d /%Y") –

+6

strftimeはDRYではありません。あなたのプロジェクト全部にstrftimeを散らしてはいけません。少なくともあなたはヘルパーについて言及しましたが、 'config/initializers/time_formats.rb'はRailsにとってもっと慣れています。 – PhilT

6

まず、タイムスタンプを実際のRubyの日付/時刻に変換する必要があります。あなたは単なる文字列としてそれを受け取るか、Facebookのからint型ならば 、あなたはこのような何かをする必要があります。そして、

my_date = Time.at(timestamp_from_facebook.to_i) 

がビューにうまくそれをフォーマットするために、あなただけの(デフォルトの書式設定) to_sを使用することができます:あなたが to_sを入れていない場合は、ビューや文字列などでそれを使用する場合、それはまだデフォルトで呼び出されること

<%= my_date.to_s %> 

注意以下は、日付にto_sを呼び出します。

<%= "Here is a date: #{my_date}" %> 

またはあなたが(「D/M/Y」を使用した例)特定の方法でフォーマットされた日付をしたい場合 - 他の回答で説明したようあなたはstrftimeを使用することができます。

+0

このコードは 'puts Time.at( '1100897479')'エラーをスローします - 正確な数値に文字列を変換できません(TypeError) – Alexandre

+0

ああ、それは文字列として到着していますか?それはint(特定のこれを含むように編集された上記の例)を確認するためにそれを確認する "to_i"です。 –

1

タイムスタンプはUNIXエポック秒なので、あなたは正しい指定子で(「文字列の解析時間」)DateTime.strptimeを使用することができます:あなたが持っている

Date.strptime('1100897479', '%s') 
#=> #<Date: 2004-11-19 ((2453329j,0s,0n),+0s,2299161j)> 
Date.strptime('1100897479', '%s').to_s 
#=> "2004-11-19" 
DateTime.strptime('1100897479', '%s') 
#=> #<DateTime: 2004-11-19T20:51:19+00:00 ((2453329j,75079s,0n),+0s,2299161j)> 
DateTime.strptime('1100897479', '%s').to_s 
#=> "2004-11-19T20:51:19+00:00" 

注意をrequire 'date'にそのために仕事に、あなたはDate.strptime(日付のみを気にする場合)またはDateTime.strptime(日付と時刻が必要な場合)のいずれかとして呼び出すことができます。別のフォーマットが必要な場合は、フォーマット文字列に苦労している場合はDateTime#strftimestrftime.netをご覧ください)またはrfc822のような組み込みメソッドの1つを使用してください。

172

タイムスタンプ文字列を解析して時間オブジェクトを設定すると(詳細は他の回答を参照)、RailsのTime.to_formatted_sを使用できます。シンボルで指定できるいくつかのフォーマットが組み込まれています。

引用:

time = Time.now      # => Thu Jan 18 06:10:17 CST 2007 

time.to_formatted_s(:time)   # => "06:10" 
time.to_s(:time)     # => "06:10" 

time.to_formatted_s(:db)   # => "2007-01-18 06:10:17" 
time.to_formatted_s(:number)  # => "20070118061017" 
time.to_formatted_s(:short)   # => "18 Jan 06:10" 
time.to_formatted_s(:long)   # => "January 18, 2007 06:10" 
time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10" 
time.to_formatted_s(:rfc822)  # => "Thu, 18 Jan 2007 06:10:17 -0600" 

(Time.to_sが別名である)

あなたはまた、独自のフォーマットを定義することができます - 通常初期化子で(これを指摘しDave Newtonのおかげで)。これが完了した方法です。

# config/initializers/time_formats.rb 
Time::DATE_FORMATS[:month_and_year] = "%B %Y" 
Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") } 
+0

+1;一番簡単な解決策は、特に既存のフォーマットのいずれかが動作する場合です。 –

+0

新しいフォーマットを登録する方法さえあると思います。 – CMW

+4

はい、イニシャライザのマップ経由。 –

13

@ CMWの回答はお金になります。私はこの答えを、日付と時刻の両方のオブジェクトがフォーマットを取得するように初期化子を設定する方法の例として追加しました。

config/initializers/time_formatsRB

date_formats = { 
    concise: '%d-%b-%Y' # 13-Jan-2014 
} 

Time::DATE_FORMATS.merge! date_formats 
Date::DATE_FORMATS.merge! date_formats 

また、次の2つのコマンドは、現在の環境ですべてのDATE_FORMATSを反復処理し、ディスプレイ今日の日付と時刻の各形式で:

Time::DATE_FORMATS.keys.each{|k| puts [k,Date.today.to_s(k)].join(':- ')} 
Time::DATE_FORMATS.keys.each{|k| puts [k,Time.now.to_s(k)].join(':- ')} 
7

localize、またはl

を見てください

例:

l Time.at(1100897479) 
+1

形式はロケールごとに異なる可能性があるため、これが最適な解決策です。必要なだけ多くのカスタムフォーマットを追加することもできます:http://guides.rubyonrails.org/i18n.html#adding-date-time-formats –

33

ここで私はこれに答えるつもりです。

まず、タイムスタンプを実際のRubyの日付/時刻に変換する必要があります。今...あなたはすでにあなたの日付オブジェクトを持って

to_formatted_sを想定し、

my_date = Time.at(timestamp_from_facebook.to_i) 

OK:あなたはちょうどそれを文字列として受け取るか、Facebookのからint型ならば、あなたはこのような何かをする必要があります。日付を書式設定された文字列に変換する便利なRuby関数です。ここで

は、その使用のいくつかの例は次のとおりです。

time = Time.now      # => Thu Jan 18 06:10:17 CST 2007  

time.to_formatted_s(:time)   # => "06:10" 
time.to_s(:time)     # => "06:10"  

time.to_formatted_s(:db)   # => "2007-01-18 06:10:17" 
time.to_formatted_s(:number)  # => "20070118061017" 
time.to_formatted_s(:short)   # => "18 Jan 06:10" 
time.to_formatted_s(:long)   # => "January 18, 2007 06:10" 
time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10" 
time.to_formatted_s(:rfc822)  # => "Thu, 18 Jan 2007 06:10:17 -0600" 

あなたが見ることができるように::デシベル、:数、:短い ...カスタム日付形式です。

独自のカスタム書式を追加するには、このファイルを作成することができます。設定/初期化子/ time_formats.rbをし、例えば、そこに独自のフォーマットを追加し、ここで一つだ:

Date::DATE_FORMATS[:month_day_comma_year] = "%B %e, %Y" # January 28, 2015 

:month_day_comma_yearあなたのフォーマットの名前です(あなたはこれを任意のものに変更できます)。%B%e、%Yはunixの日付形式です。これはあなたを助けた

From http://linux.die.net/man/3/strftime  

    %a - The abbreviated weekday name (``Sun'') 
    %A - The full weekday name (``Sunday'') 
    %b - The abbreviated month name (``Jan'') 
    %B - The full month name (``January'') 
    %c - The preferred local date and time representation 
    %d - Day of the month (01..31) 
    %e - Day of the month without leading 0 (1..31) 
    %g - Year in YY (00-99) 
    %H - Hour of the day, 24-hour clock (00..23) 
    %I - Hour of the day, 12-hour clock (01..12) 
    %j - Day of the year (001..366) 
    %m - Month of the year (01..12) 
    %M - Minute of the hour (00..59) 
    %p - Meridian indicator (``AM'' or ``PM'') 
    %S - Second of the minute (00..60) 
    %U - Week number of the current year, 
      starting with the first Sunday as the first 
      day of the first week (00..53) 
    %W - Week number of the current year, 
      starting with the first Monday as the first 
      day of the first week (00..53) 
    %w - Day of the week (Sunday is 0, 0..6) 
    %x - Preferred representation for the date alone, no time 
    %X - Preferred representation for the time alone, no date 
    %y - Year without a century (00..99) 
    %Y - Year with century 
    %Z - Time zone name 
    %% - Literal ``%'' character  

    t = Time.now 
    t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003" 
    t.strftime("at %I:%M%p")   #=> "at 08:56AM" 

ホープ:あなたはすぐにセットアップカスタムフォーマットをすることができますので、ここで

は、Unixの日付の構文上の迅速なチートシートです。 誰もが好きな場合に備えて、この小さなガイドのgithub gistを作ったことがあります。

+0

を参照してください。このリンクは質問に答えるかもしれませんが、ここでの答えの一部と参照のためのリンクを提供します。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](レビュー/低品質の投稿/ 10586543) –

+0

こんにちは@MihaiCaracostea、あなたの助言、感謝の後に私の答えを再しました:) – eduwass

関連する問題