Каков наилучший способ инициализации JavaScript Date до полуночи?

441

Какой самый простой способ получить экземпляр нового Date (), но установить время в полночь?

Sixty4Bit
источник

Ответы:

878

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

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

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

CMS
источник
42
К вашему сведению, я использую этот метод (d.setHours (0,0,0,0)) в функции сокращения для 270K строк, и это на 20 секунд быстрее, чем выполнение d.setHours (0); d.setMinutes (0); d.setSeconds (0); Отличный ответ @CMS!
12:05
32
Это нужно сделать в две строки, чтобы сохранить d как объект Date. Недавно я исправил ошибку, которая сделала это в одной строке: var d = new Date (). SetHours (0, 0, 0, 0). Однако тогда d было числом, а не датой, поскольку setHours возвращает число.
Джейсон
9
Я только что столкнулся с этим (опоздал на вечеринку, которую я знаю), также нуждающуюся в однострочном решении, возвращающем Date. Для тех , кто ищет для этого, @ ответ Зон в отлично работает: new Date(new Date().setHours(0,0,0,0)).
SRack
227

Просто хотел уточнить, что фрагмент из принятого ответа дает ближайшую полночь в прошлом :

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 часов (часы переводятся на летнее время)?
13
8
Это сценарий на стороне клиента, полночь - полночь, несмотря на летнее время. Также стоит упомянуть, что не каждое место в мире использует летнее время (летнее время)
Крис
2
@qntm: переход на летнее время всегда применяется с 2:00 до 4:00, поэтому в этот день будет только одна полночь :). Но да, 3 часа ночи может случиться дважды (лицевая сторона)
Дан
@ Крис Нет, я имею в виду второй фрагмент. «24 часа после полуночи сегодня» - это не всегда то же самое, что «полночь завтра». В этих случаях работает второй фрагмент?
2013 г.
3
@qntm: Date.setHours не добавляет вслепую 24 часа, это более разумно. Вместо этого он возвращает временную метку момента, когда часы покажут 24 в следующий раз. Принимая во внимание экономию времени. Попробуйте поиграть в консоль самостоятельно. Интересно, что setHours (25) возвращает временную метку завтрашнего дня 1 утра
Дан
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, и другие тоже могут это сделать.

[Обоснование: слово «момент» уже встречается в других местах на этой странице, поэтому поисковые машины направляют сюда, а момент.js достаточно широко распространен, чтобы его можно было охватить, как часто оно упоминается в других вопросах SO, связанных с датами]

Итак, в версии 2.0.0 и выше:

date.startOf('day');

Для более ранних версий:

date.sod();

Docs:

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

andyhasit
источник
чтобы вернуть объект даты, используйте этоmoment(DATE_OBJECT).startOf('day').toDate();
xinthose
2
да, давайте добавим библиотеку javascript размером 52 КБ, чтобы сделать то, что вы можете сделать в 2 строки.
Брюс Лим
19
А что, если вы уже используете moment.js по одной из многих причин, по которым вы могли бы ...? Как насчет прочтения обоснования, которое я дал перед добавлением саркастического комментария?
andyhasit
11

Вы, вероятно, можете использовать

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

если вам нужно значение только один раз.

Стан
источник
1
Это не получает экземпляр Date, как требуется OP.
cobberboy
Это, безусловно, лучший ответ, но нужно немного отредактировать, чтобы вернуть экземпляр 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.

jamis0n
источник
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
    }
user3887038
источник
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;
});

если вы не хотите проверять безопасность, вы можете просто использовать

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-time ( библиотека 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)
Peemster
источник
Итак, я заметил тенденцию в вопросах, связанных с JavaScript, размещенных на SO: независимо от сложности решений, предлагаемых с использованием нативного JS, любые ответы на проблему с помощью внешней библиотеки неизбежно в какой-то момент будут опровергнуты. Понимая это, я постарался опубликовать свой ответ с кратким предисловием: на случай, если у вас уже есть example.js в качестве зависимости . И все же все еще downvote, анонимный пользователь SO? это больно, чувак: '- (
Пимстер
Я не согласен с тем, что за этот ответ не следует голосовать, особенно потому, что тот, кто предлагает использовать moment.js, имеет 16 голосов против (на момент написания этого комментария). Это решает проблему очень кратко и не так очевидно.
lukeatdesignworks