Formatez la date en utilisant Ruby on Rails

L’API de flickr fournit une date de publication sous la forme d’un 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 en utilisant Ruby on Rails?

Une fois que vous avez analysé la chaîne d’horodatage et que vous avez un object 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 de l’ avoir signalé). C’est comme ça que ça se passe:

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

Voici ma réponse à cette question,

vous devez donc d’abord convertir l’horodatage en une date / heure Ruby réelle. Si vous le recevez en tant que chaîne ou int depuis facebook, vous devez faire quelque chose comme ceci:

 my_date = Time.at(timestamp_from_facebook.to_i) 

OK, en supposant maintenant que vous avez déjà votre object de date …

to_formatted_s est une fonction Ruby très pratique qui transforme les dates en chaînes 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 voir:: db,: number,: short … sont des formats de date personnalisés.

Pour append votre propre format personnalisé, vous pouvez créer ce fichier: config / initializers / time_formats.rb et y append vos propres formats. En voici un 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 remplacer par tout ce que vous voulez) et où % B% e,% Y est le format de date unix.

Voici une aide-mémoire rapide sur la syntaxe de date unix, de sorte que vous pouvez 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 de ce petit guide, au cas où quelqu’un le préférerait.

Le plus strftime est d’utiliser strftime (docs) .

Si c’est à utiliser du côté de la vue, mieux vaut l’envelopper dans une aide.

@ La réponse de CMW est frappante. J’ai ajouté cette réponse comme exemple de configuration d’un initialiseur pour que les objects Date et Heure reçoivent la mise en forme

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 

Les deux commandes suivantes DATE_FORMATS tous les DATE_FORMATS de votre environnement actuel et afficheront la date et l’heure d’aujourd’hui dans chaque format:

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

Jetez un oeil à localize , ou l

par exemple:

 l Time.at(1100897479) 

Vous devez d’abord convertir l’horodatage à une date / heure Ruby réelle. Si vous le recevez en tant que chaîne ou int depuis facebook, vous devez faire quelque chose comme ceci:

 my_date = Time.at(timestamp_from_facebook.to_i) 

Ensuite, pour le formater correctement dans la vue, vous pouvez simplement utiliser to_s (pour le formatage 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, les éléments suivants appelleront é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.

Les horodatages étant des secondes depuis l’époque UNIX, vous pouvez utiliser DateTime.strptime (“ssortingng parse time”) avec le spécificateur correct:

 Date.strptime('1100897479', '%s') #=> # Date.strptime('1100897479', '%s').to_s #=> "2004-11-19" DateTime.strptime('1100897479', '%s') #=> # DateTime.strptime('1100897479', '%s').to_s #=> "2004-11-19T20:51:19+00:00" 

Notez que vous devez require 'date' pour que cela fonctionne, puis vous pouvez l’appeler soit Date.strptime (si vous ne vous souciez que de la date) ou DateTime.strptime (si vous voulez la date et l’heure). Si vous avez besoin d’un formatage différent, vous pouvez appeler DateTime # strftime (regardez strftime.net si vous avez du mal avec les chaînes de format) ou utilisez l’une des méthodes rfc822 comme rfc822 .