Sascha Manns Ответов: 3

Почему я получаю ложное свидание


Я хотел бы преобразовать заданную дату из dd.mm.yyyy в yyyy-mm-dd. Я попробовал код ниже. Но если я даю "22.10.2018", то скрипт возвращает "2018-11-21T23:00:00.000 Z". Но почему?

Что я уже пробовал:

function hasError() {
    function toDate(datestr) {
        var parts = datestr.split(".")
        return new Date(parts[2], parts[1], parts[0])
    }

    var comparestart = toDate("22.10.2018");
    var compareende = toDate("02.11.2018");   

    console.log(comparestart);
    console.log(compareende);

    if(comparestart >= compareende) {
        console.log(true);
    } else {
        console.log(false);
    }
}

hasError();

F-ES Sitecore

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

Если вы загуглите "javascript format date", то найдете множество примеров того, как форматировать даты.

Richard MacCutchan

Вероятно, потому, что дата была скорректирована в соответствии с часовым поясом локали.

Richard MacCutchan

Конечно, спасибо, что напомнили.

3 Ответов

Рейтинг:
28

Gabriel 2

Есть 2 проблемы с кодом:
1 - объект "дата" в качестве номера месяца должен начинаться с 0, а не с 1. Линия:

new Date(parts[2], parts[1], parts[0])
должно быть:
new Date(parts[2], parts[1] - 1, parts[0])

2 - Обратите внимание на "новую дату" как на час, который должен быть в вашем местном часовом поясе (также зависит от перехода на летнее время). В этом случае новая дата(год, месяц-1, день) создает дату в вашем локальном 00:00:00 времени. Что, конечно, было бы другим местным часом для любого другого часового пояса. Любое место на Западе для вас будет предыдущей датой.

Чтобы избежать проблем с часовым поясом, всегда используйте функции UTC. Напр.:
new Date(Date.UTC(parts[2], parts[1] - 1, parts[0]))


Рейтинг:
2

Gabriel 2

Предупреждение: Решение 2 может привести к неправильной дате. Код: new Date(...) по-прежнему использует часовой пояс вашего локального компьютера.

Например, если вы запустите этот код в Калифорнии, вы получите: 2018-10-19 00:00:00 GMT-8 -> 2018-10-19 10:00:00 в Германии (в тот же день).

Но если вы запустите этот код в Пекине, Китай, вы получите: 2018-10-19 00:00:00 GMT+8 -> 2018-10-18 18:00:00 в Германии. Вчерашний день!

Если вы хотите избавиться от проблем с часовым поясом, я бы рекомендовал вам всегда использовать UTC. Например:

function toDate(datestr) {
    var parts = datestr.split(".");
    return new Date(Date.UTC(parts[2], parts[1] -1, parts[0]));
}


var comparestart = toDate("$Start");
var compareende = toDate("$Ende");

if (comparestart >= compareende) {
    return true;
} else {
    return false;
}
Для отображения даты вы можете использовать любое из следующих действий:
date.toUTCString()
date.toLocaleString('de-DE', {timeZone: 'UTC'})
date.getUTCDate() + '.' + (date.getUTCMonth() + 1) + '.' + date.getUTCFullYear()


Рейтинг:
1

Sascha Manns

Здравствуйте, большое вам спасибо за всю вашу помощь. Наконец я воспользовался этим кодом:

function hasError() {
    function toDate(datestr) {
        var parts = datestr.split(".")
        return new Date(parts[2], parts[1] -1, parts[0]).toLocaleString('de-DE', {timeZone: 'Europe/Berlin'})
    }

    var comparestart = toDate("$Start");
    var compareende = toDate("$Ende");

    if(comparestart >= compareende) {
        return true;
    } else {
        return false;
    }
}


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

Еще раз спасибо вам всем.