Отформатируйте дату с помощью Ruby on Rails
Flickr api предоставляет опубликованную дату как единую временную метку unix: "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.
"
Например, вот дата '1100897479
'. Как его форматировать с помощью Ruby on Rails?
Ответы
Ответ 1
После того, как вы проанализировали строку timestamp и имеете объект времени (подробнее см. другие ответы), вы можете использовать Time.to_formatted_s из Rails, Он имеет несколько встроенных форматов, которые вы можете указать с символами.
Цитата:
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}") }
Ответ 2
Здесь я хочу ответить,
поэтому сначала вам нужно будет преобразовать метку времени в фактическую дату/время Ruby. Если вы получите его как строку или int из facebook, вам нужно будет сделать что-то вроде этого:
my_date = Time.at(timestamp_from_facebook.to_i)
ОК, так что теперь, если вы уже имеете свой объект даты...
to_formatted_s - удобная функция 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"
Как вы можете видеть: : db,: number,: short... являются пользовательскими форматами дат.
Чтобы добавить свой собственный формат, вы можете создать этот файл: 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 - формат даты 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 gist этого маленького гида, если кто-то предпочитает.
Ответ 3
Проще всего использовать strftime
(docs).
Если это для использования на стороне просмотра, лучше обернуть его в помощнике.
Ответ 4
@CMW ответ взломал деньги. Я добавил этот ответ в качестве примера того, как настроить инициализатор, чтобы объекты Date и Time получили форматирование
конфигурации/Инициализаторы/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
в вашей текущей среде и отображать сегодняшнюю дату и время в каждом формате:
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(':- ')}
Ответ 5
Посмотрите localize
или l
например:
l Time.at(1100897479)
Ответ 6
Сначала вам нужно будет преобразовать метку времени в фактическую дату/время Ruby.
Если вы получите его как строку или int из facebook, вам нужно будет сделать что-то вроде этого:
my_date = Time.at(timestamp_from_facebook.to_i)
Затем, чтобы отформатировать его в представлении, вы можете просто использовать to_s
(для форматирования по умолчанию):
<%= my_date.to_s %>
Обратите внимание, что если вы не поместите to_s
, он по-прежнему будет вызываться по умолчанию, если вы используете его в представлении или в строке, например. следующее сообщение также будет называть to_s
в день:
<%= "Here is a date: #{my_date}" %>
или если вы хотите, чтобы форматирование даты форматировалось определенным образом (например, используя "d/m/Y" ) - вы можете использовать strftime
, как указано в другом ответе.
Ответ 7
Поскольку временные метки составляют секунды с эпохи 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 # strftime (посмотрите strftime.net, если у вас есть трудное время со строками формата) на нем или использовать один из встроенных методов, например rfc822
.