Отформатируйте дату с помощью 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 этого маленького гида, если кто-то предпочитает.

Ответ 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.