web-dev-qa-db-fra.com

Définir l’heure de DateTime dans ruby

Disons que j'ai un objet datetime, par exemple DateTime.now. Je veux régler les heures et les minutes à 0 (minuit). Comment puis je faire ça?

93
Jesse Aldridge

Dans un environnement Rails:

Grâce à ActiveSupport vous pouvez utiliser:

DateTime.now.midnight
DateTime.now.beginning_of_day

OR

DateTime.now.change({ hour: 0, min: 0, sec: 0 })

# More concisely
DateTime.now.change({ hour: 0 })                

Dans un environnement pur Ruby:

now = DateTime.now
DateTime.new(now.year, now.month, now.day, 0, 0, 0, now.zone)

OR

now = DateTime.now
DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))
203
ashoda

Pas grave, compris. Besoin de créer un nouveau DateTime:

DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
34
Jesse Aldridge

Avertissement: DateTime.now.midnight et DateTime.now.beginning_of_day retourne la même valeur (qui correspond à l'heure zéro du jour actuel - minuit ne renvoie pas 24:00:00 comme on pourrait s'y attendre de son nom).

J'ajoute donc ceci comme information supplémentaire pour quiconque pourrait utiliser la réponse acceptée pour calculer minuit x jours dans le futur.

Par exemple, un essai gratuit de 14 jours qui devrait expirer à minuit le 14e jour:

DateTime.now.midnight + 14.days

est le matin du 14ème jour, ce qui équivaut à un essai de 13.x jours (x est la partie de la journée qui reste - si c'est maintenant midi, alors il s'agit d'un essai de 13.5 jours).

Vous auriez réellement besoin de faire ceci:

DateTime.now.midnight + 15.days

pour arriver à minuit le 14e jour.

Pour cette raison, je préfère toujours utiliser beginning_of_day, puisque c'est 00:00:00. L'utilisation de minuit peut être trompeuse/mal comprise.

4
rmcsharry

Si vous l'utilisez souvent, pensez à installer cette gemme pour améliorer l'analyse de la date:

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')
2
wizztjh