64 votes

Comment comprendre strptime vs strftime

Quelle est la différence entre strptime et strftime? Je vois que strptime est une méthode de la classe DateTime, et strftime est une méthode de la classe Time.

  1. Quelle est la différence entre Time et DateTime, autre que le fait qu'ils ont des méthodes principales différentes? L'explication de la classe Time dans la documentation Ruby est utile, mais celle de DateTime dit simplement "datetime". Il y a aussi la classe Date, qui indique qu'elle fournit Date et DateTime. Aidez-moi à comprendre tout cela.
  2. Je vois strptime et j'ai envie de le prononcer "strip time", mais cela n'a pas de sens. Y a-t-il un bon moyen mnémotechnique pour cela?
  3. Que signifient en réalité strptime et strftime?
  4. Comment vous souvenez-vous de qui fait quoi?

97voto

tadman Points 70178

La différence entre Time et DateTime a à voir avec l'implémentation. Une grande partie de la fonctionnalité de DateTime vient du monde Rails et est une date arbitraire avec une heure de la journée. C'est plus un système basé sur le calendrier. Time est mesuré en secondes depuis le 1er janvier 1970 UTC et est agnostique au fuseau horaire. Sur certains systèmes, il est limité à des valeurs entre 1901 et 2038, une limitation de la manière traditionnelle dont cette valeur est stockée en tant qu'entier signé sur 32 bits, mais les versions plus récentes de Ruby peuvent gérer une gamme beaucoup plus large, en utilisant une valeur sur 64 bits ou BigNum au besoin.

En bref, DateTime est ce que vous obtenez d'une base de données dans Rails alors que Time est ce que Ruby a traditionnellement utilisé. Si vous travaillez avec des valeurs où les dates sont importantes et que vous voulez savoir des choses comme la fin du mois ou quel jour cela sera dans six semaines, utilisez DateTime. Si vous mesurez simplement le temps écoulé et que cela ne vous importe pas, utilisez Time. Ils sont faciles à convertir si nécessaire.

Date d'autre part est juste une date de calendrier et n'a aucune heure associée. Vous voudrez peut-être utiliser ces derniers où les heures sont sans importance.

strptime est l'abréviation de "analyser le temps" tandis que strftime est pour "formater le temps". Autrement dit, strptime est l'opposé de strftime bien qu'ils utilisent, de manière pratique, la même spécification de formatage. J'ai rarement vu strptime utilisé puisque DateTime.parse est généralement bon pour comprendre ce qui se passe, mais si vous avez vraiment besoin de l'énoncer clairement, n'hésitez pas à utiliser l'ancien analyseur.

60voto

PsPranav Points 853

strptime signifie analyse de chaîne, cela convertira un format de chaîne en datetime.

Exemple:-

datetime.strptime('2019-08-09 01:01:01', "%Y-%m-%d %H:%M:%S")

datetime.datetime(2019, 8, 9, 1, 1, 1)//Résultat

strftime signifie formateur de chaîne, cela formatera un objet datetime en format de chaîne.

Exemple:-

sample_date=datetime.strptime('2019-08-09 01:01:01', "%Y-%m-%d %H:%M:%S")

datetime.strftime(sample_date, "%Y-%d-%m %H:%M:%S")

'2019-09-08 01:01:01'//Résultat

3voto

Donato Points 1745

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')

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