Який найкращий спосіб ініціалізувати дату JavaScript до опівночі?


439

Який найпростіший спосіб отримати екземпляр нового Date (), але встановити час опівночі?

Відповіді:


874

setHoursМетод може приймати необов'язковий minutes, secondsі msаргументи, наприклад:

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

Це буде встановити час 00:00:00.000з поточного часового поясу , якщо ви хочете працювати в UTC часу, ви можете використовувати setUTCHoursметод.


41
FYI, я використовую цей метод (d.setHours (0,0,0,0)) у функції скорочення на 270К рядків, і це на 20 секунд швидше, ніж робити d.setHours (0); d.setMinutes (0); d.setSeconds (0); Чудова відповідь @CMS!
jbnunn

32
Це потрібно зробити в два рядки, щоб d залишався об'єктом дати. Нещодавно я виправив помилку, яка зробила це в одному рядку: var d = new Date (). SetHours (0, 0, 0, 0). Однак d був тоді числом, а не датою, оскільки setHours повертає число.
Джейсон

9
Я щойно натрапив на це (пізно на вечірку, яку я знаю), також мені потрібно однорядне рішення, що повертає Дату. Для тих , хто шукає для цього, @ відповідь Зон в відмінно працює: new Date(new Date().setHours(0,0,0,0)).
SRack

226

Просто хотів уточнити, що фрагмент із прийнятої відповіді дає найближчу півночі минулого :

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

Якщо ви хочете отримати найближчу півночі в майбутньому , використовуйте наступний код:

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

6
Що станеться, якщо сьогодні триває 25 годин (годинники регулюються вперед для літнього часу)?
qntm

8
Це сценарій на стороні клієнта, опівночі - опівночі, незважаючи на економію літнього часу. Також заслуговує на увагу .. не кожне місце у світі використовує DST (літній час)
chris

2
@qntm: зміна літнього часу завжди застосовується о 2 ранку до 4 ранку, так що протягом цього дня буде лише одна півночі :). Але так, 3 ранку може статися двічі в протягом дня (Facepalm)
Dan

@chris Ні, я маю на увазі другий фрагмент. "24 години після півночі сьогодні" - це не завжди те саме, що "завтра опівночі". Чи працює в цих випадках другий фрагмент?
qntm

3
@qntm: Date.setHours не сліпо додає 24 години, це розумніший. Натомість він повертає часову позначку моменту, коли годинник покаже 24 наступного разу. З огляду на економію часу. Спробуйте самі пограти в консоль. Цікавий, setHours (25) повертає тимчасову мітку 1am завтрашнього
Dan

68

Одне вкладиш для конфігурацій об'єкта:

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

Під час створення елемента:

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

6
Дякую! Мені було цікаво, як я можу це зробити в одному рядку, тому що я встановлював властивість об'єкта! Чудова відповідь.
Паулу Роберто Роза

Спасибі Зон, це допомогло мені написати це єдиний рядок.
HungrySoul

22

Я просто додам це сюди, тому що я приземлився на цій сторінці, шукаючи, як це зробити в moment.js та інші.

[Обґрунтування: слово "момент" вже з’являється в іншому місці на цій сторінці, тому пошукові системи направляють сюди, а moment.js є досить поширеним, щоб вимагати того, щоб його часто обговорювали, як часто це згадується в інших питаннях щодо ПЗ]

Отже, у версії 2.0.0 і вище:

date.startOf('day');

Для більш ранніх версій:

date.sod();

Документи:

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


щоб повернути об’єкт дати, скористайтесь цимmoment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
так, давайте додати бібліотеку javascript у 52 Кбіт, щоб зробити щось, що ви можете зробити у 2 рядки.
Брюс Лім

19
А що робити, якщо ви вже використовуєте moment.js з однієї з багатьох вагомих причин, з яких ви можете ...? Як щодо читання обґрунтування, яке я висловив перед тим, як додати саркастичний коментар?
andyhasit

11

Можливо, ви можете використовувати

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

якщо вам потрібно значення лише один раз.


1
Це не отримує екземпляр дати, як вимагає ОП.
ковбой

Це виразно найкраща відповідь, але потрібно трохи змінити, щоб повернути екземпляр дати. new Date (new Date (). setUTCHours (0, 0, 0, 0));
VitFL

4

Додаючи корисність прикладу @ Dan, у мене виникла потреба знайти наступного полудня чи півночі.

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
}

Це дозволило мені встановити обмеження частоти для події, лише дозволяючи це траплятися один раз вранці та один раз в другій половині дня для будь-якого відвідувача мого сайту. Записана дата була використана для встановлення терміну дії файлу cookie.


4

Якщо підрахунок дат літній час часто спричинить на 1 ур більше або на годину менше, ніж опівночі (CEST). Це спричиняє різницю в 1 день, коли дати повертаються. Тож дати повинні округнути до найближчої півночі. Отже, код буде (тис. До 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

Я зробив пару прототипів, щоб вирішити це для мене.

// 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;
});

якщо ви не хочете перевірити saftey, тоді ви можете просто скористатися

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

Приклад використання:

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

2

Якщо у вас вже є d3.js як залежність у вашому проекті, або не проти ввести його, d3-час ( бібліотека d3.js є модульним, ніж v4.0.0 ) має інтервали .

Вони можуть виявитися корисними при встановленні дат значення "за замовчуванням", наприклад, опівночі, 0,00 секунд, першого місяця тощо.

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)

Тож я помітив тенденцію щодо питань, пов’язаних з JavaScript, розміщених на SO: незалежно від складності рішень, що висуваються з використанням нативного JS, будь-які відповіді на вирішення цього питання за допомогою зовнішньої бібліотеки неминуче в якийсь момент не будуть сприйняті. Зрозумівши це, я подбав про те, щоб опублікувати свою відповідь за допомогою швидкої передмови: Якщо ви вже маєте example.js як залежність . І все-таки все-таки анонімний користувач SO? що болить, чоловіче: '- (
Peemster

Я вважаю, що за цю відповідь не слід голосувати, тим більше, що той, хто пропонує використання moment.js, має 16 голосів (на момент написання цього коментаря). Це вирішує проблему дуже стисло і не так очевидно.
lukeatdesignworks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.