Imposta la parte temporale di DateTime in ruby


104

Diciamo che ho un oggetto datetime es DateTime.now. Voglio impostare ore e minuti su 0 (mezzanotte). Come lo posso fare?

Risposte:


220

All'interno di un ambiente Rails:

Grazie ad ActiveSupport puoi utilizzare:

DateTime.now.midnight
DateTime.now.beginning_of_day

O

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

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

All'interno di un ambiente puramente Ruby:

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

O

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

26
FWIW, il metodo di modifica fa parte di rails non ruby. Le opzioni relative al tempo (ora, minuto, sec) si ripristinano in sequenza, quindi se viene trascorsa solo l'ora, minuti e secondi vengono impostati su 0. Se vengono trascorsi l'ora e i minuti, sec viene impostato su 0.
Anna

1
Tieni presente che DateTime.now.midnight non restituisce 24:00:00 come potresti aspettarti, ma restituisce 00:00:00, lo stesso valore di begin_of_day. Vedi la mia risposta sul motivo per cui questo potrebbe essere importante in alcuni scenari.
rmcsharry

1
La tua prima soluzione puramente rubino elimina le informazioni sul fuso orario, la seconda no
Tony

1
Ho aggiornato la risposta per tenere conto del fuso orario e ho sostituito la seconda variazione. @Tony cattura molto bene, in realtà erano entrambi suscettibili alla perdita di informazioni sul fuso orario a uno sguardo più attento. DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
ashoda

TIMEZONE: Può essere modificato dalla parola chiave offset nell'argomento hash: DateTime.now.change ({hour: 0, min: 0, sec: 0 offset: '+02: 00'})
Ekkstein

34

Non importa, capito. È necessario creare un nuovo DateTime:

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

6
Buona risposta. Volevo solo aggiungere che quegli zeri rappresentano HOUR, MINUTE, SECOND e OFFSET (fuso orario) in quest'ordine.
d_ethier

3
Dopo non essere riuscito a farlo funzionare, l'ho imparato con: DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0)funziona.
Ekkstein

2
Non dimenticare: now = DateTime.now
Abel

1
Inoltre, per notare che l'ultimo argomento deve essere una stringa del fuso orario ad es. ("- 0700") per MST, non un numero intero
Donavan White

2
A meno che tu non abbia a che fare con date storiche, NON USARE DateTime. Avrai problemi fastidiosi se vivi in ​​un paese che ha l'ora legale come il Regno Unito. Vedi una spiegazione qui. gist.github.com/pixeltrix/e2298822dd89d854444b
fatuhoku

5

Attenzione : DateTime.now.midnighte DateTime.now.beginning_of_dayrestituisce lo stesso valore (che è l'ora zero del giorno corrente - mezzanotte non restituisce 24:00:00 come ci si aspetterebbe dal suo nome).

Quindi aggiungo questo come ulteriori informazioni per chiunque possa utilizzare la risposta accettata per calcolare la mezzanotte x giorni in futuro.

Ad esempio, una prova gratuita di 14 giorni che dovrebbe scadere a mezzanotte del 14 ° giorno:

DateTime.now.midnight + 14.days

è la mattina del 14 ° giorno, che equivale a 13,5 giorni di prova (x è la parte della giornata rimasta - se ora è mezzogiorno, allora è 13,5 giorni di prova).

In realtà dovresti farlo:

DateTime.now.midnight + 15.days

per arrivare a mezzanotte del 14 ° giorno.

Per questo motivo preferisco sempre utilizzare beginning_of_day, dato che è 00:00:00. Usare la mezzanotte può essere fuorviante / frainteso.


1

Se lo usi spesso, considera l'installazione di questo gioiello per migliorare l'analisi della data:

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')

Non sono sicuro del motivo per cui questa risposta è contrassegnata come corretta. Non risponde davvero alla domanda. So come analizzare una stringa in una data. Ma vorrei sapere come modificare una parte particolare di una determinata istanza di data. Ad esempio l'anno. Qualche idea? In Java userei solo il setter per un anno. Ma non funziona in Ruby :-(
Robert Reiz

1
Non mi fido più della gemma cronica. È davvero antiquato. Ho avuto problemi nell'analisi della data e dell'ora in fase di esecuzione nella mia app che ha comportato la perdita di attività.
Vijay Meena
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.