Сравнение только части даты без сравнения времени в JavaScript


397

Что не так с кодом ниже?

Может быть, было бы проще просто сравнить дату, а не время. Я не уверен, как это сделать, и я искал, но я не мог найти свою точную проблему.

Кстати, когда я отображаю две даты в предупреждении, они отображаются одинаково.

Мой код:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Есть ли более простой способ сравнить даты, не включая время?

Ответы:


781

Я все еще изучаю JavaScript, и единственный найденный мной способ сравнить две даты без времени - это использовать setHoursметод объекта Date и установить ноль часов, минут, секунд и миллисекунд. Затем сравните две даты.

Например,

date1 = new Date()
date2 = new Date(2011,8,20)

date2будут установлены равными нулю часами, минутами, секундами и миллисекундами, но для date1 будет установлено время создания даты1. Чтобы избавиться от часов, минут, секунд и миллисекунд на дату1, сделайте следующее:

date1.setHours(0,0,0,0)

Теперь вы можете сравнивать две даты только как ДАТЫ, не беспокоясь об элементах времени.


63
Пожалуйста, имейте в виду, что тестирование по- date1 === date2видимому, не обеспечивает согласованного поведения; это лучше сделать date1.valueOf() === b.valueOf()или даже date1.getTime() === date2.getTime(). Странность.
Эрвин Вессельс

4
Будьте осторожны: если date1 и date2 зимой и летом, и вы планируете переходить от одного к другому с помощью addDays (1), проблема в том, что они не будут иметь одинаковый часовой пояс из-за перехода на летнее время, поэтому последний Сравните, что должно дать равные даты не будет работать, потому что две даты на самом деле не в 00: 00: 00: 0.
Оливер

9
Я знаю, что это старый вопрос, но он появляется первым в Google при поиске. Будьте осторожны с этим ответом. Это даст неправильные ответы, если пользователь не находится в том же часовом поясе, что и создатель объекта даты. Например, измените часовой пояс операционной системы вашего компьютера на время Восточного побережья (США). Откройте консоль вашего браузера и введите var date2 = new Date(2011,8,20). Теперь измените часовой пояс ОС на Pacific Time (США). В том же браузере введите консоль, date2.toDateString()и вы вернетесь, Mon Sep 19 2011а не вторник 20-го!
Адам

9
Также обратите внимание, что setHours()устанавливает время на основе текущего часового пояса, который автоматически определяется браузером. Попробуйте: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());напечатает "2016-02-28T15:00:00.000Z", дата 28, но не 29 Мой текущий часовой поясAsia/Tokyo
transang

8
Этот ответ действительно должен быть обновлен, чтобы использовать setUTCxxxметоды вместо вариантов с учетом локальных / часовых поясов.
Стейн де Витт

137

ОСТЕРЕГАЙТЕСЬ ВРЕМЕНИ

Использование объекта date для непосредственного представления даты просто поставит вас перед проблемой чрезмерной точности. Вы должны управлять временем и часовым поясом, чтобы не пускать их, и они могут вернуться обратно на любом этапе. Принятый ответ на этот вопрос попадает в ловушку.

Дата в JavaScript не имеет понятия о часовом поясе . Это момент времени (тики с начала эпохи) с удобными (статическими) функциями для перевода в и из строк, с использованием по умолчанию «локального» часового пояса устройства или, если указан, UTC или другого часового пояса. Чтобы представить just-a-date ™ с объектом даты, вы хотите , чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты. Это общее и необходимое соглашение, которое позволяет вам работать с датами независимо от сезона или часового пояса их создания. Таким образом, вы должны быть очень бдительными, чтобы управлять понятием часового пояса, как при создании объекта «Дата в формате UTC», так и при его сериализации.

Многие люди смущены поведением консоли по умолчанию. Если вы распылите дату на консоль, вы увидите, что вы увидите ваш часовой пояс. Это просто потому, что консоль вызывает toString()вашу дату и toString()дает вам местное представительство. Базовая дата не имеет часового пояса ! (До тех пор, пока время соответствует смещению часового пояса, у вас все еще будет объект даты UTC в полночь)

Десериализация (или создание полуночных UTC Date объектов)

Это шаг округления с хитростью в том, что есть два «правильных» ответа. В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя. Нажмите, если сегодня ваш день рождения . Пользователи в Новой Зеландии и США нажимают одновременно и получают разные даты. В таком случае сделай это ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

Иногда международная сопоставимость превосходит локальную точность. В таком случае сделай это ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Десериализовать дату

Часто даты на проводе будут в формате ГГГГ-ММ-ДД. Чтобы десериализовать их, сделайте это ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Сериализация

Позаботившись об управлении часовым поясом при создании, теперь вы должны быть уверены, что часовой пояс не будет отображаться при преобразовании обратно в строковое представление. Так что вы можете смело использовать ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

И полностью избегать всего остального, особенно ...

  • getYear(), getMonth(),getDate()

Так что, чтобы ответить на ваш вопрос, 7 лет слишком поздно ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

Вижу это работает ...

Обновление 2019 ... бесплатные вещи ...

Учитывая популярность этого ответа, я поместил все это в код. Следующая функция возвращает обернутый объект даты и предоставляет только те функции, которые безопасно использовать с just-a-date ™.

Вызовите его с объектом Date, и он будет преобразован в JustADate, отражая часовой пояс пользователя. Назовите его строкой: если строка соответствует ISO 8601 с указанием часового пояса, мы просто округлим часть времени. Если часовой пояс не указан, мы конвертируем его в дату, отражающую местный часовой пояс, как и для объектов даты.

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())


3
Ваш ответ содержит действительно ценную информацию! К сожалению, вы на самом деле не добавили ответ на фактический вопрос ОП, не давая мне возможности проголосовать за него. Попробуйте добавить небольшой фрагмент кода, который отвечает на вопрос OP.
Стейн де Витт

Ха-ха-ха @ '7 лет слишком поздно'! Мне нравится твой стиль user1585345! Вы получили мой голос!
Стейн де Витт

Я нашел это полезным. Обратите внимание, что во фрагменте "международной сопоставимости" есть опечатка. Я думаю, что это должно быть: новая дата (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak

1
Я бы хотел 100 раз подтвердить этот ответ !!!
Снаđошƒаӽ

77

Как насчет этого?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Это позволяет вам сравнивать часть даты с датой следующим образом, не влияя на значение вашей переменной:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

Это, безусловно, самый элегантный ответ на оригинальный пост. Я не создавал отдельную функцию для своих целей, просто включил две строки кода.
Данимал Рекс

25

Использование Moment.js

Если у вас есть возможность включить стороннюю библиотеку, определенно стоит взглянуть на Moment.js . Это делает работу с DateиDateTime много, гораздо проще.

Например, видя, что одна Дата идет после другой, но исключая их время, вы должны сделать что-то вроде этого:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

Второй параметр , который вы проходите в isAfterэто точность , чтобы сделать сравнение и может быть любой из year, month, week, day, hour, minuteили second.


4
получил ускорение в 100 раз от решения моментов к решению Date () + sethours. осторожные друзья :-)
2c2c

@ 2c2c Интересно. Определенно полезно знать влияние на производительность. Сколько операций вы использовали для своего теста?
Джошуа Пинтер

1
у меня было около 1 мил сравнения. не установил фактический тест
2c2c

17

Просто сравните, используя .toDateString, как показано ниже:

new Date().toDateString();

Это вернет вам только часть даты, а не время или часовой пояс, например:

«Пт Фев 03 2017»

Следовательно, обе даты можно сравнивать в этом формате аналогично без временной части.


2
Это хорошее начало, но оно не позволяет сравнивать, потому что теперь это строка. Для сравнения измените его обратно на объект Date, выполнив new Date(new Date().toDateString());
Grid Trekkor

@GridTrekkor Верно, но если вам нужен быстрый тест на равенство, это самое простое решение.
СМ

8

Это может быть немного более чистая версия, также обратите внимание, что вы должны всегда использовать основание при использовании parseInt.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

Посетите страницу parseInt MDC для получения дополнительной информации о radix.

JSLint - это отличный инструмент для обнаружения таких вещей, как отсутствующий корень и многие другие вещи, которые могут вызвать неясные и сложные ошибки в отладке. Это заставляет вас использовать лучшие стандарты кодирования, чтобы избежать головной боли в будущем. Я использую его в каждом проекте JavaScript, который я кодирую.


@EmKay Это не должно быть такой большой проблемой сейчас, так как ES5 довольно стандартен в большинстве браузеров и запрещает восьмеричную интерпретацию, НО некоторые браузеры могут все еще использовать старую восьмеричную интерпретацию для обратной совместимости, поэтому я бы продолжал использовать основную часть в обозримом будущем.
бесполезный код

Если вы используете строгий режим, восьмеричные интерпретации будут приводить к ошибкам, и это хорошо, потому что это помогает вам находить ошибки, которые могут быть неправильно истолкованы.
Бесполезный код


4

Если вы действительно сравниваете дату только с отсутствующим временным компонентом, другое решение, которое может показаться неправильным, но работает и позволяет избежать Date()головной боли во времени и часовом поясе, - это сравнить строковую дату ISO напрямую, используя сравнение строк:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Вы можете получить текущую дату (дату UTC, а не обязательно локальную дату пользователя), используя:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Мой аргумент в пользу этого - простота программиста - вы гораздо меньше рискуете испортить это, чем пытаться правильно обрабатывать время и смещение, вероятно, за счет скорости (я не сравнивал производительность)


Вы также можете сделать new Date().toISOString().substr(0, 10) // "2019-04-22".
стомия

Для местной даты (не UTC) вы можете использовать new Date().toLocaleDateString() // "8/26/2019". Но тогда сравнение текста не будет точным (например "8/26/2019" >= "9/29/2001", ложным). Поэтому вам необходимо преобразовать его, new Date(new Date().toLocaleDateString())чтобы точно сравнить с другой датой.
Стоми

4

Просто используйте toDateString () для обеих дат. toDateString не включает время, поэтому для 2 раз в одну и ту же дату значения будут одинаковыми, как показано ниже.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

Очевидно, что некоторые проблемы с часовыми поясами, высказанные в других местах по этому вопросу, являются действительными, но во многих случаях они не актуальны.


1
В моем случае это решение намного лучше, чем выбранный ответ и ответы с большим количеством голосов. Это прямо сказано в заголовке «без сравнения времени», это решение делает именно это, избавляя от необходимости устанавливать время для манипулирования сравнением. Чтобы ответить «произошло ли событие X и событие Y в один и тот же день», имеет больше смысла сравнивать только дату, а не отвечать «Является ли 00: 00: 00.00 AM даты события X точно такой же, как 00:00: 00.00 даты события Y? " это то, что делают многие другие ответчики
Mr.K

3

Вот как я это делаю:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}

В настоящее время я использую это в производстве, и у меня нет проблем или несовместимости браузера и т. Д. ... есть ли причины, по которым вы говорите, что getTime()это необходимо?
Фабрицио

5
Обратите внимание, что setHours()изменяет объект, к которому он вызывается, и возвращает дату в виде количества миллисекунд (эквивалентно вызову getTime()). Следовательно, ваша todayпеременная не является Dateобъектом, как некоторые ожидают, но на самом деле представляет собой целое число миллисекунд. В качестве побочного эффекта именно поэтому вам не нужно было звонить getTime()перед сравнением, так как вы уже сделали это неясным образом.
Тимоти Уолтерс

3

Поскольку я не вижу здесь подобного подхода, и мне не нравится устанавливать h / m / s / ms в 0, так как это может вызвать проблемы с точным переходом на местный часовой пояс с измененным dateобъектом (я полагаю, так), позвольте мне представьте здесь, написанную несколько минут назад, функцию lil:

+: Прост в использовании, выполняет базовые операции сравнения (сравнивая день, месяц и год без времени.)
-: Кажется, что это полная противоположность мышлению «из коробки».

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

Применение:

datecompare(date1, '===', date2)для проверки на равенство,
datecompare(date1, '>', date2)для большей проверки,
!datecompare(date1, '>', date2)для проверки меньшей или равной

Также, очевидно, вы можете переключаться date1и date2местами, чтобы добиться любого другого простого сравнения.


Хороший, плюс плюс, помог мне, теперь, надеюсь, преобразования ISO не кусаются, ха-ха, спасибо.
edencorbin

3

Эффективный и правильный способ сравнения дат:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Он игнорирует временную часть, он работает для разных часовых поясов, и вы также можете сравнить на равенство ==. 86400000 - это количество миллисекунд в дне (= 24*60*60*1000 ).

Учтите , что оператор равенства ==не должен никогда использоваться для сравнения объектов Date , поскольку он терпит неудачу , когда можно было бы ожидать тест равенства на работе , потому что это сравнение двух объектов Date (и не сравнить две даты) , например:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

Примечания: Если вы сравниваете объекты Date, у которых часть времени установлена ​​на ноль, то вы можете использовать, date1.getTime() == date2.getTime()но вряд ли стоит оптимизировать. Вы можете использовать <, >, <=или >=при сравнении даты объектов напрямую , потому что эти операторы сначала преобразовать объект Date, вызвав .valueOf()перед оператором делает сравнение.


2

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

Я использовал что-то вроде этого:

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

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

Таким образом, я мог бы использовать даты в том формате, который хотел потом обработать. Но это было только для моей необходимости, но я все равно решил опубликовать это, может быть, это кому-то поможет


1
Обратите внимание, что ваша currentDateпеременная не дата, а количество миллисекунд с 1970-01-01. В setHours()метод изменяет даты объекта он вызывается, и возвращает эквивалент getTime()(значение даты в миллисекундах , так как 1970-01-01).
Тимоти Уолтерс

1

Удостоверьтесь, что вы строите userDateс 4-значным годом как setFullYear(10, ...) !== setFullYear(2010, ...).


1

Вы можете использовать некоторую арифметику с суммой мс.

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

Мне это нравится, потому что обновления оригинальных дат не производятся и выполняются быстрее, чем разбивка строк и сравнение.

Надеюсь, это поможет!


1

Этот JS изменит содержание после установленной даты, это то же самое, но в w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->


1

Это работает для меня:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

В принятом ответе есть проблема часового пояса, а в другое время нет 00:00:00


0

Я знаю, что на этот вопрос уже был дан ответ, и это, возможно, не лучший способ, но в моем сценарии он работает отлично, поэтому я подумал, что он может помочь кому-то, как я.

если у вас есть date stringкак

String dateString="2018-01-01T18:19:12.543";

и вы просто хотите сравнить часть даты с другим объектом Date в JS,

var anotherDate=new Date(); //some date

то вы должны к объекту с помощьюconvertstringDatenew Date("2018-01-01T18:19:12.543");

и вот фокус:

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

Я использовал toDateString()из Date objectJS, который возвращает только строку даты.

Примечание: не забудьте использовать .valueOf()функцию при сравнении дат.

больше информации о .valeOf()здесь ссылка

Удачной кодировки.


0

Это поможет. Мне удалось получить это так.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())

0

Сравнение с setHours()будет решением. Образец:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}

0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

если формат даты отличается, то используйте библиотеку moment.js для преобразования формата даты, а затем используйте приведенный выше код для сравнения двух дат

Пример :

Если ваша дата указана в формате «ДД / ММ / ГГГГ» и требуется преобразовать ее в «ММ / ДД / ГГГГ», см. Приведенный ниже пример кода

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0

Вы можете использовать fp_incr (0). Который устанавливает часть часового пояса в полночь и возвращает объект даты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.