Différence entre DateTime et de Temps en Ruby
Quelle est la différence entre DateTime
et Time
classes en Ruby et quels sont les facteurs qui me ferait choisir l'un ou l'autre?
- Les docs a un article, en expliquant à utiliser.
Vous devez vous connecter pour publier un commentaire.
Les nouvelles versions de Ruby (2.0+) n'ont pas vraiment de différences significatives entre les deux classes. Certaines bibliothèques utilisera l'un ou l'autre pour des raisons historiques, mais le nouveau code n'a pas nécessairement besoin d'être concerné. En choisir un pour la cohérence est probablement le meilleur, alors essayez et mesh avec ce que vos bibliothèques attendre. Par exemple, ActiveRecord préfère DateTime.
Dans les versions antérieures à Ruby 1.9 et sur de nombreux systèmes, le Temps est représenté comme un signé 32 bits valeur décrivant le nombre de secondes depuis le 1er janvier 1970 UTC, un mince wrapper autour d'une POSIX standard
time_t
valeur, et est délimitée:Les nouvelles versions de Ruby sont en mesure de traiter de plus grandes valeurs sans produire des erreurs.
DateTime est un calendrier basé sur l'approche de l'année, mois, jour, heure, minute et seconde sont stockés individuellement. C'est un Ruby on Rails construction qui sert comme un wrapper autour de SQL standard les champs DATETIME. Ceux-ci contiennent arbitraire dates et peuvent représenter près n'importe quel point dans le temps, dans la gamme d'expression est très grand.
Il est donc rassurant de voir que DateTime peut gérer les messages de blog à partir d'Aristote.
Moment d'en choisir un, les différences sont assez subjective, maintenant. Historiquement DateTime a offert de meilleures options pour manipuler dans un calendrier de la mode, mais la plupart de ces méthodes ont été portés au fil du Temps, au moins dans les Rails de l'environnement.
Time.strptime("2050-03-10 10:00", "%Y-%m-%d %H:%M")
travail et de montrer2050-03-10 10:00:00 -0500
?Time
pasDateTime
sauf si vous travaillez avec des dates historiques (c'est à dire, pré-Grégorien). Ne pas le faire peut entraîner, par exemple, l'Heure d'été / Heure d'Été fuseau horaire questions.[Modifier Juillet 2018]
Tous les ci-dessous reste vrai en Ruby 2.5.1. À partir de la la documentation de référence:
Ce qui n'a pas été noté dans ce fil avant est l'un des rares avantages de
DateTime
: il est au courant du calendrier des réformes alors queTime
n'est pas:La documentation de référence se termine par la recommandation de l'utilisation de
Time
exclusivement affaire avec le proche passé, actuel ou futur de la date/heure et de n'utiliserDateTime
lorsque, par exemple, de Shakespeare anniversaire doit être exactement de la conversion: (italiques ajoutés)[/Edit Juillet 2018]
De ruby 2.0, la plupart des informations dans les autres réponses, c'est hors de date.
En particulier,
Time
est maintenant pratiquement indépendant. Elle peut être plus ou moins de même 63 bits loin de l'Époque:La seule conséquence de l'utilisation de plus grandes valeurs de performance, ce qui est mieux quand
Integer
s sont utilisés (vsBignum
s (valeurs en dehors deInteger
gamme) ouRational
s (lorsque nanosecondes sont suivis)):En d'autres termes, comme je le comprends,
DateTime
n'est plus couvre un plus large éventail de valeurs possibles queTime
.En outre, deux précédemment sous silence les restrictions de
DateTime
devrait probablement être noté:D'abord,
DateTime
a pas de notion de secondes intercalaires:Deuxième,
DateTime
a une compréhension très limitée des zones de temps et, en particulier, n'a aucune notion de l'heure d'été. Il gère les fuseaux horaires comme simple UTC + X décalages:Cela peut causer des problèmes lorsque les temps sont entrés comme de l'heure d'été, puis converti en une non-de l'heure d'été de fuseau horaire, sans garder une trace de l'corriger les décalages à l'extérieur de
DateTime
lui-même (de nombreux systèmes d'exploitation peuvent déjà prendre soin de cela pour vous).Dans l'ensemble, je dirais que de nos jours
Time
est le meilleur choix pour la plupart des applications.Remarque également une différence importante sur plus: lorsque vous ajoutez un nombre à un objet de Temps, il est compté en secondes, mais lorsque vous ajoutez un nombre à un DateTime, il est compté en jours.
Dépassées! Voir ci-dessous...
La différence de performance ne peut pas être assez souligné... le Temps est C, et DateTime est Ruby:
Mise à jour (2/2012):
Comme déjà mentionné dans le commentaire, 1.9.3 a considérablement amélioré la
DateTime
performance:DateTime
implémenté en C: rubyinside.com/ruby-1-9-3-preview-1-released-5229.html donc cette réponse nous l'espérons ne pas être pertinentes pour beaucoup plus longtemps.DateTime: 0.520000 0.010000 0.530000 ( 0.522596) | Time: 2.800000 0.000000 2.800000 ( 2.814311)
DateTime: 0.200000 0.010000 0.210000 ( 0.200798) | Time: 0.180000 0.000000 0.180000 ( 0.184122)
DateTime: 0.400000 0.000000 0.400000 ( 0.405093) Time: 5.480000 19.280000 24.760000 ( 24.809307)
Je pense que la réponse à "quelle est la différence" est l'un des la malheureuse commune réponses à cette question dans le Rubis bibliothèques standard: les deux classes/libs ont été créés différemment par des personnes différentes à des moments différents. C'est l'une des conséquences malheureuses de la nature communautaire de Ruby évolution par rapport à soigneusement planifié le développement de quelque chose comme Java. Les développeurs veulent de nouvelles fonctionnalités, mais ne veulent pas marcher sur les APIs existantes pour qu'elles puissent créer une nouvelle classe à l'utilisateur final, il n'y a pas de raison évidente pour les deux existent.
Cela est vrai pour les bibliothèques de logiciels en général: souvent la raison pour laquelle certains de code ou de l'API est la façon dont il est s'avère être historique plutôt que logique.
La tentation est de commencer avec DateTime parce qu'il semble plus générique. Date... et le Temps, non? Mal. Le temps fait aussi des dates de mieux, et en fait peut analyser les fuseaux horaires où DateTime peut pas. Aussi, il a de meilleures performances.
J'ai fini par utiliser le Temps partout.
Pour être sûr de bien, j'ai tendance à permettre DateTime arguments à être passé dans mon Timey Api, et de convertir. Aussi, si je sais que les deux ont la méthode, je suis intéressé par j'accepte, soit, comme cette méthode que j'ai écrit pour la conversion de temps à XML (pour les fichiers XMLTV)
Time.new(2011, 11, 1, 10, 30)
produit2011-11-01 10:30:00 +0700
toutDateTime.new(2011, 11, 1, 10, 30)
produitTue, 01 Nov 2011 10:30:00 +0000
.J'ai trouvé des choses telles l'analyse et de calculer la date de début/fin d'une journée dans différents fuseaux horaires sont plus facile à faire avec DateTime, en supposant que vous utilisez le ActiveSupport extensions.
Dans mon cas, j'ai besoin de calculer la fin de la journée, dans un fuseau horaire de l'utilisateur (arbitraire) en fonction de l'utilisateur, heure locale, que j'ai reçu comme une chaîne de caractères, par exemple "2012-10-10 10:10 +0300"
Avec DateTime c'est aussi simple que
Essayons maintenant de la même façon avec le Temps:
En fait, le Temps a besoin de connaître le fuseau horaire avant l'analyse (à noter également qu'il est
Time.zone.parse
, pasTime.parse
):Donc, dans ce cas, il est certainement plus facile d'aller avec DateTime.
DateTime.parse('2014-03-30 01:00:00 +0100').end_of_day
produitSun, 30 Mar 2014 23:59:59 +0100
, maisTime.zone = 'CET'; Time.zone.parse('2014-03-30 01:00:00').end_of_day
produitSun, 30 Mar 2014 23:59:59 CEST +02:00
(HEC=+01:00, CEST a=+02:00 - avis le décalage changé). Mais pour ce faire, vous avez besoin de plus d'informations sur le fuseau horaire de l'utilisateur (et pas seulement de compenser, mais également si le gain de temps est utilisé).Time.zone.parse
est très utile lors de l'analyse des fois avec différentes zones - il vous oblige à réfléchir sur la zone qui vous devriez être en utilisant. Parfois, Le Temps.find_zone fonctionne encore mieux.Time
un décalage, mais un fuseau horaire ("CET" ne décrit pas un décalage, c'est le nom d'un fuseau horaire). Les fuseaux horaires qui peuvent avoir des positions différentes tout au long de l'année, mais un décalage est un décalage et c'est toujours la même.Examiner comment ils traitent les fuseaux horaires différemment personnalisée avec des instanciations:
Cela peut être difficile lors de la création de plages de temps, etc.
Il semble que dans certains cas, le comportement est très différent: