使用Ruby on Rails格式化date
flickr api提供一个发布date作为unix timestamp之一:“ The posted date is always passed around as a unix timestamp, which is an unsigned integer specifying the number of seconds since Jan 1st 1970 GMT.
例如,这里是date' 1100897479
'。 如何使用Ruby on Rails进行格式化?
一旦你已经分析了时间戳string,并有一个时间对象(请参阅其他答案的细节),你可以使用从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}") }
这是我的回答,
所以首先您需要将时间戳转换为实际的Rubydate/时间。 如果您从Facebook接收string或int,则需要执行以下操作:
my_date = Time.at(timestamp_from_facebook.to_i)
好吧,现在假设你已经有你的date对象…
to_formatted_s是一个方便的Ruby函数,将date转换为格式化的string。
以下是其用法的一些示例:
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"
正如你可以看到:: db,:number,:short …是自定义的date格式。
要添加你自己的自定义格式,你可以创build这个文件: config / initializers / time_formats.rb并在那里添加你自己的格式,例如这里是一个:
Date::DATE_FORMATS[:month_day_comma_year] = "%B %e, %Y" # January 28, 2015
其中:month_day_comma_year是您的格式名称(您可以将其更改为任何您想要的),并且%B%e,%Y是unixdate格式。
这是一个关于unix date语法的快速备忘单,所以你可以快速设置自定义格式:
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"
希望这对你有所帮助。 我也做了这个小指南github的要点 ,以防万一谁喜欢。
最简单的就是使用strftime
(docs) 。
如果是在视图方面使用,尽pipe如此,最好把它包装在帮助器中。
@ CMW的答案就是金钱。 我已经添加了这个答案作为如何configuration一个初始值设定项的例子,以便date和时间对象得到格式
configuration/初始化/ time_formats.rb
date_formats = { concise: '%d-%b-%Y' # 13-Jan-2014 } Time::DATE_FORMATS.merge! date_formats Date::DATE_FORMATS.merge! date_formats
另外,以下两个命令将遍历当前环境中的所有DATE_FORMATS
,并以各种格式显示当天的date和时间:
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(':- ')}
看看localize
,或l
例如:
l Time.at(1100897479)
首先,您需要将时间戳转换为实际的Rubydate/时间。 如果您从Facebook接收string或int,则需要执行以下操作:
my_date = Time.at(timestamp_from_facebook.to_i)
然后在视图中很好地格式化,你可以使用to_s
(默认格式):
<%= my_date.to_s %>
请注意,如果您不放置to_s
,则在视图或string中使用它时,它仍然会被默认调用,例如下面的date也会调用to_s
:
<%= "Here is a date: #{my_date}" %>
或者如果你想以特定的方式格式化date(例如使用“d / m / Y”) – 你可以使用strftime
,如其他答案中所述。
由于时间戳记是自UNIX纪元以来的秒数,所以可以使用DateTime.strptime (“stringparsing时间”)和正确的说明符:
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
(如果您只关心date)或DateTime.strptime
(如果您需要date和时间)。 如果你需要不同的格式,你可以调用DateTime#strftime (如果你对格式化string有困难的话,请看strftime.net )或者使用像rfc822
这样的内置方法之一。