使用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这样的内置方法之一。