convertir String en DateTime

100

J'ai besoin d'analyser la chaîne suivante dans un objet DateTime:
30/Nov/2009:16:29:30 +0100

Y a-t-il un moyen facile de faire ceci?

PS: Je veux convertir la chaîne ci-dessus telle quelle. Le colon après l'année n'est pas une faute de frappe. Je veux aussi résoudre le problème avec Ruby et non RoR.

SkaveRat
la source

Réponses:

100

DateTime.strptime vous permet de spécifier le format et de convertir une chaîne en DateTime.

Kaleb Brasee
la source
1
Merci. Manqué, que je pourrais lui donner mon propre format. Voici celui qui fonctionne: '% d /% b /% Y:% H:% M:% S'
SkaveRat
1
@SkaveRat Votre chaîne respecte-t-elle le fuseau horaire? J'utilise%d/%b/%Y:%H:%M:%S %Z
knut
4
Pour une liste des abréviations de format disponibles, gist.github.com/halloffame/5350249
Ryan
9
Il serait poli de spécifier un exemple de conversion de chaîne, que l'utilisateur a demandé, pas seulement "aller lire là-bas" (où est des tonnes d'informations d'ailleurs). Stackoverflow populaire non pas parce qu'il donne des liens vers de la documentation externe, mais donne des réponses aux questions
Daniel Garmoshka
Existe-t-il un moyen de faire une «correspondance exacte»? Actuellement, le comportement est "correspondant depuis le début", donc %Ycorrespondra aux deux 2015(comme prévu) et 2016-foo-barpuisqu'il s'arrête quand il voit 2016. Ce comportement est cohérent avec l'homologue C; cependant, la fonction C renvoie la position de la fin de la correspondance (par exemple la première -dans le cas «2016») pour nous permettre de décider si la correspondance est exacte; dans Ruby, il renvoie a DateTime, donc nous ne pouvons pas dire s'il y a encore quelque chose après.
Franklin Yu
97

Cela ne devrait-il pas fonctionner également?

"30/Nov/2009 16:29:30 +0100".to_datetime
Xentek
la source
1
fonctionne bien dans Rails 3.2.3 en utilisant Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => mer, 16 mai 2012 02:30:00 +0000
Tilo
58
Il s'agit également d'une méthode Ruby on Rails, pas d'une méthode Ruby.
JackCA
5
Cela devrait être: require 'active_support/all' et ensuite "30/Nov/2009 16:29:30 +0100".to_datetime (vous n'avez pas réellement besoin de toutes les extensions active_support, mais bonne chance pour déterminer lesquelles exiger de manière sélective)
Matt Zukowski
2
ActiveSupport est présenté assez sainement, mais pour le moins d'impact, cela devrait être tout ce dont vous avez besoin pour être to_datetimeajouté aux Stringobjets:require 'active_support/core_ext/string/conversions'
xentek
3
La question concerne "30 / Nov / 2009: 16: 29: 30 +0100" et non "30 / Nov / 2009 16:29:30 +0100". C'est une autre raison pour laquelle cela ne fonctionne pas.
schmijos
46

J'ai eu du succès avec:

require 'time'
t = Time.parse(some_string)
Automatico
la source
15

J'ai utilisé Time.parse("02/07/1988"), comme certaines des autres affiches.

Un piège intéressant était qu'il Timeétait chargé par défaut lorsque j'ai ouvert IRB, mais Time.parsen'était pas défini. J'ai dû le require 'time'faire fonctionner.

C'est avec Ruby 2.2.

déclan
la source
12

Cela convertira la chaîne de date en datetime:

"05/05/2012".to_time
user1425976
la source
20
Il s'agit d'une méthode Ruby on Rails, pas d'une méthode Ruby.
JackCA
1
Bien que ce ne soit pas la réponse à cette question, cela m'a beaucoup aidé. Merci @ user1425976
karlingen
11

Pour les développeurs chinois de Rails:

DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
Siwei Shen 申思维
la source
5

dans Ruby 1.8, le module ParseDate convertira ce format et de nombreux autres formats de date / heure. Cependant, il ne traite pas gracieusement le côlon entre l'année et l'heure. En supposant que deux-points est une faute de frappe et est en fait un espace, alors:

#!/usr/bin/ruby1.8

require 'parsedate'

s = "30/Nov/2009 16:29:30 +0100"
p Time.mktime(*ParseDate.parsedate(s))    # =>  Mon Nov 30 16:29:30 -0700 2009
Wayne Conrad
la source
1

Vous pouvez également analyser une chaîne de date / heure avec un fuseau horaire donné:

zone = "Pacific Time (US & Canada)"
ActiveSupport::TimeZone[zone].parse("2020-05-24 18:45:00")
=> Sun, 24 May 2020 18:45:00 PDT -07:00
KM Rakibul Islam
la source