ОСТЕРЕГАЙТЕСЬ ВРЕМЕННОЙ ЗОНЕ
Использование объекта даты для непосредственного представления даты-даты влечет за собой огромную проблему избыточной точности.Вам нужно управлять временем и часовым поясом, чтобы не пускать их, и они могут вернуться обратно на любом этапе. Принятый ответ на этот вопрос попадает в ловушку.
Дата JavaScript не имеет понятия о часовом поясе .Это момент времени (тики начиная с эпохи) с удобными (статическими) функциями для перевода в и из строк, с использованием по умолчанию «локального» часового пояса устройства или, если указано, UTC или другого часового пояса.Чтобы представить дату с помощью объекта даты, вы хотите, чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты. Это общее и необходимое соглашение, которое позволяет работать с датами независимо от сезона иличасовой пояс их создания.Поэтому вам нужно быть очень бдительными, чтобы управлять понятием часового пояса, как при создании объекта «Дата в формате UTC», так и при его сериализации.
Многие люди смущены поведением консоли по умолчанию.Если вы распылите дату на консоль, вы увидите, что вы увидите ваш часовой пояс.Это просто потому, что консоль вызывает toString()
в вашу дату, а toString()
дает вам локальное представление.Базовая дата не имеет часового пояса !(Пока время совпадает со смещением часового пояса, у вас все еще есть объект даты UTC в полночь)
десериализация (или создание объектов даты UTC в полночь)
Большинство извремя, вы хотите, чтобы ваша дата отражала часовой пояс пользователя. Нажмите, если сегодня ваш день рождения .Пользователи в Новой Зеландии и США нажимают одновременно и получают разные даты.В этом случае сделайте это ...
// 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){
debugger;
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>
Вижу это ...