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.

Réponses:


100

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


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

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)

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.


12

Cela convertira la chaîne de date en datetime:

"05/05/2012".to_time

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.