web-dev-qa-db-fra.com

Formatez la date avec Ruby le Rails

L'API flickr fournit une date postée sous la forme du timestamp 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. "

Par exemple, voici la date '1100897479 '. Comment le formater avec Ruby sur Rails?

71
Alexandre

Une fois que vous avez analysé la chaîne timestamp et que vous avez un objet time (voir les autres réponses pour plus de détails), vous pouvez utiliser Time.to_formatted_s à partir de Rails. Il a plusieurs formats intégrés que vous pouvez spécifier avec des symboles.

Citation:

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 est un alias)

Vous pouvez également définir vos propres formats - généralement dans un initialiseur (Merci à Dave Newton pour l'avoir signalé). Voici comment cela se fait:

# 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}") }
183
CMW

Voici ma réponse à cette question,

donc vous devez d’abord convertir l’horodatage en un Ruby Date/Heure) réel. Si vous le recevez sous la forme d’une chaîne ou d’un int de facebook, vous devrez procéder de la manière suivante:

my_date = Time.at(timestamp_from_facebook.to_i)

OK, alors supposons que vous ayez déjà votre objet de date ...

to_formatted_s est une fonction pratique Ruby) qui convertit les dates en chaînes de caractères formatées.

Voici quelques exemples d'utilisation:

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"

Comme vous pouvez le constater: : db,: number,: short ... sont des formats de date personnalisés.

Pour ajouter votre propre format personnalisé, vous pouvez créer ce fichier: config/initializers/time_formats.rb et ajoutez vos propres formats, par exemple:

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

: month_day_comma_year est le nom de votre format (vous pouvez le changer en tout ce que vous voulez), et où % B% e,% Y correspond au format de date Unix.

Voici une brève feuille de calcul sur la syntaxe de date Unix, afin que vous puissiez rapidement configurer votre format personnalisé:

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"

J'espère que cela vous a aidé. J'ai également fait un github Gist de ce petit guide, au cas où quelqu'un le préférerait.

38
Edu Wass

Le plus simple est d'utiliser strftime (docs) .

Si c'est pour une utilisation du côté de la vue, il vaut mieux l'envelopper dans une aide, cependant.

27
Dave Newton

@ La réponse de CMW est un coup sur l’argent. J'ai ajouté cette réponse comme exemple de configuration d'un initialiseur de sorte que les objets Date et Heure obtiennent le formatage.

config/initializers/time_formats.rb

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

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

De plus, les deux commandes suivantes parcourent tous les DATE_FORMATS dans votre environnement actuel et affichez la date et l'heure du jour dans chaque format:

Date::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(':- ')}
16
ReggieB

Regardez localize , ou l

par exemple:

l Time.at(1100897479)
7
Benjamin Crouzier

Vous devez d’abord convertir l’horodatage en un Ruby Date/heure) réel. Si vous le recevez sous la forme d’une chaîne ou d’un message int de Facebook, vous devrez procéder de la manière suivante:

my_date = Time.at(timestamp_from_facebook.to_i)

Ensuite, pour le formater correctement dans la vue, vous pouvez simplement utiliser to_s (pour la mise en forme par défaut):

<%= my_date.to_s %>

Notez que si vous ne mettez pas to_s, il sera toujours appelé par défaut si vous l’utilisez dans une vue ou dans une chaîne, par exemple. le suivant appellera également to_s à la date:

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

ou si vous souhaitez que la date soit formatée de manière spécifique (par exemple, en utilisant "d/m/Y") - vous pouvez utiliser strftime comme indiqué dans l'autre réponse.

6
Taryn East

Les horodatages étant exprimés en secondes depuis l’époque UNIX, vous pouvez utiliser DateTime.strptime ("durée d’analyse de chaîne") avec le spécificateur correct:

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"

Notez que vous devez require 'date' pour que cela fonctionne, vous pouvez l’appeler soit comme Date.strptime (si vous vous souciez seulement de la date) ou DateTime.strptime (si vous voulez la date et l'heure). Si vous avez besoin d'une mise en forme différente, vous pouvez appeler DateTime # strftime (regardez strftime.net si vous avez du mal à utiliser les chaînes de format) ou utilisez l'une des options suivantes: méthodes intégrées comme rfc822.

1
Michael Kohl