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


441

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

Ответы:


878

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

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

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


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/


чтобы вернуть объект даты, используйте это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.


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

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

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)

Итак, я заметил тенденцию в вопросах, связанных с JavaScript, размещенных на SO: независимо от сложности решений, предлагаемых с использованием нативного JS, любые ответы на проблему с помощью внешней библиотеки неизбежно в какой-то момент будут опровергнуты. Понимая это, я постарался опубликовать свой ответ с кратким предисловием: на случай, если у вас уже есть example.js в качестве зависимости . И все же все еще downvote, анонимный пользователь SO? это больно, чувак: '- (
— Пимстер

Я не согласен с тем, что за этот ответ не следует голосовать, особенно потому, что тот, кто предлагает использовать moment.js, имеет 16 голосов против (на момент написания этого комментария). Это решает проблему очень кратко и не так очевидно.
— lukeatdesignworks
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.