Qual è il modo migliore per inizializzare una data JavaScript a mezzanotte?


441

Qual è il modo più semplice per ottenere un'istanza di nuova Data () ma impostare l'ora a mezzanotte?

Risposte:


877

Il setHoursmetodo può prendere opzionale minutes, secondse msgli argomenti, per esempio:

var d = new Date();
d.setHours(0,0,0,0);

Ciò imposterà l'ora 00:00:00.000del tuo fuso orario corrente , se vuoi lavorare nell'ora UTC, puoi usare il setUTCHoursmetodo.


42
Cordiali saluti, sto eseguendo questo metodo (d.setHours (0,0,0,0)) in una funzione di riduzione su 270K righe ed è più veloce di oltre 20 secondi rispetto a d.setHours (0); d.setMinutes (0); d.setSeconds (0); Ottima risposta @CMS!
jbnunn,

32
Questo deve essere fatto in due righe per mantenere d come oggetto Date. Recentemente ho corretto un bug che lo faceva in una riga: var d = new Date (). SetHours (0, 0, 0, 0). Tuttavia, d era quindi un numero, non una data poiché setHours restituisce un numero.
Jason,

9
Mi sono appena imbattuto in questo (in ritardo per la festa che conosco), che ha anche bisogno di una soluzione di una riga per restituire una data. Per chi cerca questo, @ risposta di Zon funziona perfettamente: new Date(new Date().setHours(0,0,0,0)).
SRack

227

Volevo solo chiarire che lo snippet dalla risposta accettata dà la mezzanotte più vicina in passato :

var d = new Date();
d.setHours(0,0,0,0); // last midnight

Se si desidera ottenere la mezzanotte più vicina in futuro , utilizzare il seguente codice:

var d = new Date();
d.setHours(24,0,0,0); // next midnight

6
Cosa succede se oggi dura 25 ore (gli orologi si regolano in avanti per l'ora legale)?
qntm,

8
Questo è lo script lato client, la mezzanotte è la mezzanotte, nonostante l'ora legale. Anche una menzione degna di nota .. non tutti i luoghi del mondo usano l'ora legale (ora legale)
chris

2
@qntm: il cambio dell'ora legale viene sempre applicato alle 2: 00-04: 00, quindi sarà solo una mezzanotte durante quel giorno :). Ma sì, le 3 del mattino possono accadere due volte durante il giorno (facepalm)
Dan

@chris No, intendo il secondo frammento. "24 ore dopo la mezzanotte di oggi" non è sempre la stessa cosa di "domani a mezzanotte". In questi casi, funziona il secondo frammento?
qntm

3
@qntm: Date.setHours non aggiunge alla cieca 24 ore, è più intelligente. Invece, restituisce un timestamp del momento, quando l'orologio mostrerà 24 la prossima volta. Tenendo conto del risparmio di tempo. Prova a giocare nella console da solo. Interessante, setHours (25) restituisce il timestamp di domani 1am
Dan

68

Un one-liner per le configurazioni degli oggetti:

new Date(new Date().setHours(0,0,0,0));

Quando si crea un elemento:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}

6
Grazie! mi chiedevo come posso farlo in una sola riga perché stavo impostando una proprietà dell'oggetto! Bella risposta.
Paulo Roberto Rosa,

Grazie Zon, questo mi ha aiutato a scriverlo su una riga.
HungrySoul

22

Lo aggiungerò qui solo perché sono atterrato su questa pagina cercando come farlo in moment.js e anche altri potrebbero farlo.

[Razionale: la parola "momento" appare già altrove in questa pagina, quindi i motori di ricerca si dirigono qui, e moment.js è abbastanza diffuso da garantire di essere coperto continuando su quanto spesso viene menzionato in altre domande relative alla data]

Quindi, nella versione 2.0.0 e successive:

date.startOf('day');

Per le versioni precedenti:

date.sod();

Documenti:

http://momentjs.com/docs/#/manipulating/start-of/


per recuperare un oggetto data, usa questomoment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
yay, aggiungiamo una libreria javascript da 52kb per fare qualcosa che puoi fare in 2 righe.
Bruce Lim,

19
E se stai già usando moment.js per uno dei tanti buoni motivi che potresti ...? Che ne dici di leggere la logica che ho dato prima di aggiungere un commento sarcastico?
Andyhasit

11

Probabilmente puoi usare

new Date().setUTCHours(0,0,0,0)

se hai bisogno del valore una sola volta.


1
Questo non ottiene un'istanza di una data, come richiesto dall'OP.
cobberboy,

Questa è sicuramente la risposta migliore, ma necessita di una piccola modifica per restituire un'istanza di una Data. nuova data (nuova data (). setUTCHours (0, 0, 0, 0));
VitFL

4

Aggiungendo utilità all'esempio di @ Dan, ho avuto la necessità di trovare il mezzogiorno o la mezzanotte successivi.

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

Questo mi ha permesso di impostare un limite di frequenza per un evento, consentendomi solo una volta al mattino e una volta al pomeriggio per qualsiasi visitatore del mio sito. La data acquisita è stata utilizzata per impostare la scadenza del cookie.


4

Se il calcolo con le date dell'estate causerà spesso 1 uur in più o un'ora in meno della mezzanotte (CEST). Ciò causa una differenza di 1 giorno al ritorno delle date. Quindi le date devono arrotondare alla mezzanotte più vicina. Quindi il codice sarà (ths to jamisOn):

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }

3

Ho realizzato un paio di prototipi per gestire questo per me.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

se non vuoi il controllo di sicurezza, puoi semplicemente usare

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

Esempio di utilizzo:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());

2

Nel caso in cui abbiate già d3.js come dipendenza nel vostro progetto, o non vi dispiaccia accedervi , d3-time (la libreria d3.js è modulare dalla v4.0.0 ) ha gli Intervalli .

Potrebbero rivelarsi utili quando si impostano le date su valori "predefiniti", ad esempio mezzanotte, 0,00 secondi, il primo del mese, ecc.

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)

Quindi ho notato una tendenza nelle domande relative a JavaScript pubblicate su SO: indipendentemente dalla complessità delle soluzioni presentate utilizzando JS nativo, ogni risposta che risolverà il problema con l'aiuto di una libreria esterna verrà inevitabilmente ridotta a un certo punto nel tempo. Realizzando questo, mi sono preoccupato di pubblicare la mia risposta con la prefazione rapida: nel caso in cui tu abbia già example.js come dipendenza . Eppure ancora l'utente SO anonimo e downvote? che fa male, amico: '- (
Peemster,

Sono caduto sul fatto che questa risposta non dovrebbe essere votata al ribasso soprattutto perché quella che propone l'uso di moment.js ha 16 voti in più (al momento di scrivere questo commento). Risolve il problema in modo molto conciso e non così ovvio.
lukeatdesignworks,
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.