web-dev-qa-db-fra.com

Comment créer un objet de date Ruby à partir d'une chaîne?

Comment créer un objet de date Ruby à partir de la chaîne suivante?

DD-MM-YYYY
60
ben
Date.parse('31-12-2010')

Alternativement Date#strptime(str, format) .

117
deceze

Comme aux États-Unis, les dates sont inversées, il est important de ne pas utiliser simplement Date.parse(), car vous constaterez que le 11 septembre 2001 peut être le 11 septembre 2001 aux États-Unis et le 9 novembre 2001 dans le reste du monde. Pour être complètement non ambigu, utilisez Date::strptime(your_date_string,"%d-%m-%Y") afin d’analyser correctement une chaîne de date au format dd-mm-yyyy.

Essayez ceci pour être sûr:

>irb
>> require 'date'
=> true
>> testdate = '11-09-2001'
=> "11-09-2001"
>> converted = Date::strptime(testdate, "%d-%m-%Y")
=> #<Date: 4918207/2,0,2299161>
>> converted.mday
=> 11
>> converted.month
=> 9
>> converted.year
=> 2001

Pour les autres formats strptime, voir http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html

De plus, je m'assure toujours de régler mon fuseau horaire de base sur :utc si mon site Web doit traiter des dates, et d'utiliser Javascript du côté client pour afficher les heures locales.

29
Dave Sag

Vous pouvez utiliser Time # parse .

Time.parse("20-08-2010")
# => Fri Aug 20 00:00:00 +0200 2010

Cependant, comme Ruby peut analyser la date comme "MM-JJ-AAAA", la meilleure solution consiste à utiliser DateTime # strptime pour spécifier le format de saisie.

16
Simone Carletti

Je trouve cette approche plus simple puisqu'elle évite d'avoir à spécifier le format de date pour l'analyseur:

date1 = heure.local (2012, 1, 20, 12, 0, 0) .à_date

1
jpwynn

Comme ceci, vous pouvez obtenir time Object à partir d'une chaîne comme ceci:

t = Time.parse "9:00 PM" 
 => 2013-12-24 21:00:00 +0530

t = Time.parse "12:00 AM"
 => 2013-12-24 00:00:00 +0530 

Mais Ruby analyse cela comme une date!

Vous pouvez donc utiliser la colonne comme une chaîne.

add_column :table_name, :from, :string, :limit => 8, :default => "00:00 AM", :null => false
add_column :table_name, :to, :string, :limit => 8, :default => "00:00 AM", :null => false 

Et vous pouvez affecter un objet chaîne à l'attribut,

r.from = "05:30 PM"
r.save

Et analyser la chaîne pour obtenir l'objet de temps,

Time.zone.parse("02:00 PM")
1
Abhi

Pas nécessaire pour ce format de chaîne particulier, mais le meilleur utilitaire d'analyse de chaîne de temps que je connaisse est Chronic , qui est disponible sous forme de gemme et fonctionne pour environ 99,9% des cas d'utilisation de dates/heures au format humain.

0
bglusman