J'ai lu la réponse ci-dessus et elle est claire dans sa délimitation du Temps, DateTime et Date en Ruby.
Le Temps est inclus dans Ruby. Il est mesuré en secondes depuis le 1er janvier 1970 UTC et est indépendant du fuseau horaire. Plus précisément, la classe Time stocke des nombres entiers, ce qui représente les intervalles de secondes depuis l'Époque. Nous pouvons considérer cela comme le Temps Unix. Il a quelques limitations. J'ai lu quelque part que s'il est stocké en tant qu'entier signé sur 64 bits, il peut représenter des dates entre le 12 novembre 1823 et le 20 février 2116, mais sur mon système, il peut représenter des dates en dehors de cette plage. Si vous ne spécifiez pas le fuseau horaire à utiliser dans la variable d'environnement ENV['TZ'], alors il sera par défaut celui de l'heure système trouvé dans /etc/localtime sur les systèmes de type Unix. Quand utiliser Time? Il est utile pour mesurer le temps écoulé ou interpoler un horodatage dans une valeur de chaîne.
Rails étend en réalité la classe Time. Cela se fait à travers ActiveSupport::TimeWithZone. Il fournit un support pour les fuseaux horaires configurables. Notez que Rails convertira toujours le fuseau horaire en UTC avant d'écrire ou de lire depuis la base de données, peu importe le fuseau horaire que vous définissez dans le fichier de configuration. En d'autres termes, c'est le comportement par défaut de Rails que tout votre temps sera enregistré dans la base de données au format UTC.
# Obtenir l'heure actuelle en utilisant le fuseau horaire du système local actuel ou ENV['TZ'] si ce dernier est défini.
Time.now
# Obtenir l'heure actuelle en utilisant le fuseau horaire UTC
Time.now.utc
# Obtenir le timestamp Unix de l'heure actuelle => 1524855779
Time.now.to_i
# Convertir de nouveau le timestamp Unix en forme d'heure
Time.at(1524855779)
# UTILISER l'implémentation de Time de Rails! Remarquez que nous disons Time.current plutôt que Time.now. Cela vous permettra d'utiliser le fuseau horaire défini dans la configuration de Rails et d'avoir accès à toutes les fonctionnalités liées au fuseau horaire fournies par ActiveSupport::TimeWithZone.
Time.current
TimeWithZone fournit beaucoup de méthodes d'aide très utiles :
# Obtenir l'heure du n-ième jour, semaine, mois, année précédents
1.jour.ago
1.semaine.ago
3.mois.ago
1.an.ago
# Obtenir le début ou la fin du jour, de la semaine, du mois ...
Time.now.beginning_of_day
30.jours.ago.end_of_day
1.semaine.ago.end_of_month
# Convertir l'heure en timestamp Unix
1.semaine.ago.beginning_of_day.to_i
# Convertir une instance d'heure en instance de date
1.mois.ago.to_date
Pour la plupart des cas, la classe Time avec le fuseau horaire de ActiveSupport de Rails est suffisante. Mais parfois, vous avez tout simplement besoin d'une date.
Tout comme avec la classe Time, Ruby inclut la classe Date. Il suffit de requérir la bibliothèque de temps :
require "time"
Time.parse("8 décembre 2015 10:19")
#=> 2015-12-08 10:19:00 -0200
Date.parse("8 décembre 2015")
#=> #
Time.new(2015, 12, 8, 10, 19)
#=> 2015-12-08 10:19:00 -0200
Date.new(2015, 12, 8)
Comme Date fait partie de Ruby, elle utilise par défaut le fuseau horaire défini dans /etc/localtime sur les systèmes de type Unix, à moins que vous ne modifiez la variable environnementale TZ. Tout comme avec la classe Time, Rails étend la classe Date. Utilisez Date.current au lieu de Date.today pour profiter de ActiveSupport::TimeWithZone et utiliser les configurations de fuseau horaire basées sur Rails.
Maintenant, il y a une autre classe disponible en ce qui concerne les dates et heures. DateTime est une sous-classe de Date et peut facilement gérer la date, l'heure, les minutes, les secondes et le décalage. Elle est disponible à la fois en Ruby (via require 'time') et en Rails (via require 'date'). Rails l'étend avec des capacités de Fuseau horaire tout comme avec la classe Time.
require 'date'
DateTime.new(2001,2,3,4,5,6)
Personnellement, je ne vois pas la nécessité d'utiliser DateTime dans vos applications, car vous pouvez utiliser Time lui-même pour représenter des dates et heures, et vous pouvez utiliser Date pour représenter des dates.
La deuxième partie de la question portait sur strptime et strftime. Time, Date et DateTime ont tous les deux les méthodes strptime et strftime. strptime analyse la représentation de chaîne donnée et crée un objet. Voici un exemple :
> result = Time.strptime "27/04/2018", "%m/%d/%Y"
=> 2018-04-27 00:00:00 -0400
> result.class
=> Time
C'est utile si vous avez une application et qu'un utilisateur soumet un formulaire et vous donne une date et/ou représentée sous forme de chaîne. Vous voudrez la parser en un Time ou une Date avant de l'enregistrer dans la base de données.
strftime formate une date ou heure. Vous l'appelez donc sur un objet Date ou Time :
> Date.current.strftime("%Y-%m-%d")
=> "2018-04-27"
Et vous pouvez les utiliser ensemble pour d'abord analyser l'entrée de l'utilisateur, puis la formater d'une certaine manière, peut-être pour la sortir dans un fichier csv :
value = Date.strptime(val, '%m/%d/%Y').strftime('%Y-%m-%d')