34 votes

Les cours Date, Heure et DateTime sont-ils nécessaires ?

Quel est le but d'avoir des classes Date et Heure quand il ya une classe DateTime qui peut gérer les deux?

43voto

Andrew Vit Points 10630

Pour résumer ce que le commun ruby classes de temps sont:

Time

C'est la bête de somme de base rubis temps de classe.

  • A la date et l'heure attributs (année, mois, jour, heure, min, sec, subsec)
  • Basé sur floating-point de secondes depuis l'époque unix (1970-01-01)
  • Peut gérer les négatifs fois avant l'époque unix
  • Peut gérer le temps de l'arithmétique dans les unités de secondes
  • Mode natif fonctionne dans les deux UTC ou "local" (fuseau horaire du système d')

Il y a vraiment 3 types d'objet en Temps quand il s'agit de traiter avec les fuseaux horaires, regardons l'heure d'été de montrer de l'heure d'été:

utc = Time.utc(2012,6,1) # => 2012-12-21 00:00:00 UTC
utc.zone       # => "UTC"
utc.dst?       # => false
utc.utc?       # => true
utc.utc_offset # => 0

local = Time.local(2012,6,1) # => 2012-06-01 00:00:00 -0700
local.zone       # => "PDT"
local.dst?       # => true
local.utc?       # => false
local.utc_offset # => -25200

nonlocal = Time.new(2012,6,1,0,0,0, "-07:00") # => 2012-06-01 00:00:00 -0700
nonlocal.zone       # => nil
nonlocal.dst?       # => false
nonlocal.utc?       # => false
nonlocal.utc_offset # => -25200

Les 2 dernières se ressemblent, mais méfiez-vous: vous ne devriez pas faire des opérations avec les non-local Time. C'est tout simplement un moment avec un décalage UTC et aucune zone, de sorte qu'il ne connaît pas les règles de l'heure d'été. L'ajout de temps au cours de l'heure d'été limite ne changera pas le décalage et le temps de la journée sera mauvaise.

ActiveSupport::TimeWithZone

Celui-ci est intéressant de mentionner ici, puisque c'est ce que vous utilisez dans les Rails. En même Temps, plus:

  • Peut gérer n'importe quel fuseau horaire
  • Respecte l'heure d'été
  • Peut convertir temps entre les zones

En général j'ai toujours atteindre pour cette lorsque ActiveSupport est disponible comme il prend soin de tous les temps de la zone de pièges.

Date

  • A la date d'attributs uniquement (année, mois, jour)
  • Basé sur entier durant toute une journée d'intervalle à partir de l'arbitraire d'un "jour zéro" (-4712-01-01)
  • Peut gérer des opérations arithmétiques dans les unités de tout les jours
  • Peut convertir entre les dates dans l'ancien calendrier Julien au Grégorien moderne

La Date est plus utile que de Temps chaque fois que vous le traiter de tout les jours: pas de zones de temps à s'inquiéter! (Je suis surpris que cela ne veut pas traiter avec le persan moderne calendrier depuis qu'il sait sur le obsolètes calendrier Julien depuis des siècles.)

DateTime

  • A la date et l'heure attributs (année, mois, jour, heure, min, sec)
  • Basé sur des fractions de jours d'intervalle à partir de l'arbitraire d'un "jour zéro" (-4712-01-01)
  • Peut gérer des opérations arithmétiques dans les unités de jours entiers ou des fractions

Personnellement, je ne jamais avoir raison de l'utiliser: c'est lent, il gère le temps sans tenir compte des fuseaux horaires, et il a des incohérences dans l'interface. Je trouve qu'il amène de la confusion à chaque fois que vous supposez que vous avez un Temps-comme l'objet, mais en fait il se comporte comme une Date à la place:

Time.new(2012, 12, 31, 0, 0, 0) + 1 == Time.new(2012, 12, 31, 0, 0, 1)
DateTime.new(2012, 12, 31, 0, 0, 0) + 1 == DateTime.new(2013, 1, 1, 0, 0, 0)

De plus, il a un sens de "zone", attribut (notez que non-local Time objets vous avertir que zone == nil), et vous ne pouvez pas savoir autre chose sur elle avant de se tourner dans un premier Temps:

dt = DateTime.new(2012,12,6, 1, 0, 0, "-07:00")
dt.zone # => "-07:00"
dt.utc? # => NoMethodError: undefined method `utc?'
dt.dst? # => NoMethodError: undefined method `dst?'
dt.utc_offset # => NoMethodError: undefined method `utc_offset'

Traiter avec les microsecondes pour vérifier l'arrondissement est aussi un peu étrange. Vous pourriez penser que cela n'aura pas d' usec de l'attribut qu'il traite uniquement des nombres entiers, mais vous auriez tort:

DateTime.now.usec # => NoMethodError: undefined method `usec'
DateTime.now.to_time.usec => 629399

En bref, sauf si vous avez affaire à des événements astronomiques dans le passé antique et la nécessité de convertir la date du calendrier Julien (le moment de la journée) pour un calendrier moderne, veuillez ne pas utiliser DateTime. Si quelqu'un a un réel cas d'utilisation de cette classe, je serais ravi de lire vos commentaires.

28voto

steenslag Points 29662

Je sais qu'il y a une réponse acceptée, mais j'ai quelque chose à ajouter. La classe Date est un poids lourd, classe de force académique. Il peut gérer toutes sortes de RFC, analyseles les choses les plus étranges et convertit les dates de julian d'il y a mille ans en grégorien avec la date de la réforme de choix. La classe Time est légère et elle ne connaît rien de tout cela. C'est moins cher et qui apparaît dans une référence:

Résultat:

(Ruby 1.9.2)

17voto

sawa Points 62592

DateTime est une sous-classe de Date, de sorte que vous pouvez faire avec Date peut être fait avec DateTime. Mais comme tadman et steenslag point de sortir, DateTime est plus lent. Voir steenslag de répondre de façon beaucoup plus lente, il est.

À l'égard DateTime vs, Time, j'ai trouvé quelque chose ici.

Citation


Time is a wrapper around Unix-Epoch.
Date (and DateTime) use rational and a "day zero" for storage. So Time 
is faster but the upper and lower bounds are tied to epoch time (which 
for 32bit epoch times is something around 1970-2040 ... while Date (and DateTime) have an 
almost infinite range but are terribly slow.

En bref, DateTime est un tout autour de superstar, et doit être préféré en général, mais si vous voulez l'optimiser pour le dernier morceau, à l'aide de Time peut améliorer les performances.

4voto

Austin Taylor Points 3966

Une autre façon de penser de ceci est que, Date et DateTime modèle de temps en ce qui concerne les horloges et les calendriers, ce qui est utile pour décrire la fois pour les utilisateurs, et la planification d'événements. Avoir un Date sans le temps est agréable quand vous n'avez pas de soins sur le temps, et vous ne voulez pas de penser à la fois des zones.

Time modèles de temps comme un continuum, et est un wrapper autour de la timestamp Unix, qui est juste un entier. Ceci est utile pour toutes sortes d'applications internes lorsque l'ordinateur ne s'intéresse pas trop de savoir si un calendrier de limite a été franchie, mais juste combien de secondes (ou millisecondes) se sont écoulés.

-1voto

Malfist Points 10488

Oui. La Date ne s'occupe que de la date de quelque chose, I. E., 31 Mars 1989. Mais il ne gère pas le Temps, par exemple, à 12 H 30. DateTime, peut gérer à la fois, le 31 Mars 1989 à 12 H 30, heure de l'est.

Parfois, vous n'avez pas besoin de toutes les pièces de type DateTime. Par exemple, vous souhaitez savoir quand les utiliser signé pour vous site, la Date serait utile ici, parce que le temps est finalement sans importance.

Dans certains cas, vous pourriez juste le temps. Par exemple, si c'est l'heure du déjeuner, vous pouvez indiquer à l'utilisateur votre bureau est fermé. À ce stade, les Données n'est pas pertinent.

Cependant, dans la plupart des cas DateTime est utilisé, car il peut être utilisé soit comme la date, l'heure, ou les deux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X