Пикадай и moment.js - PullRequest
       29

Пикадай и moment.js

0 голосов
/ 08 января 2019

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

 <input type="text" id="txtArrival">
 <input type="text" id="txtDeparture">

var aDate, dDate, a, days;

//arrival 
    aDate = new Pikaday({
        field: document.getElementById('txtArrival'),
        defaultDate: new Date(),
        format: 'D MMM YYYY',
        setDefaultDate: true,
        minDate: new Date(),
        onSelect: function () {
            console.log(aDate.getMoment().format('DD/MM/YY'));
            var s_date = this.getDate();
            var e_date = dDate.getDate();
            // regardless set the end date to be forced to select a date from the start date
            dDate.setMinDate(this.getDate());
            // if the start date is now > end date then change the end date
            if (s_date > e_date) {
                dDate.setDate(s_date);
            }
        }
    });
    // departure
 dDate = new Pikaday({
     field: document.getElementById('txtDeparture'),
     defaultDate: new Date() + 1,
     setDefaultDate: true,
     format: 'D MMM YYYY',
     onSelect: function () {
        console.log(dDate.getMoment().format('DD/MM/YY'));
    }
    });

1 Ответ

0 голосов
/ 08 января 2019

Я думаю, проблема в том, как вы устанавливаете дату в поле dDate. new Date() + 1 не добавит день к дате (он может добавить миллисекунду или добавить «1» к строке даты).

То, что вы хотите сделать, это построить дату из ее части:

var date = new Date(); // todays date
date.setDate(date.getDate() + 1);

Затем установите его:

defaultDate: date, 
... etc, etc

Причина, по которой ваш код не работает, заключается в том, что даты в javascript технически являются целым числом за кулисами. Целое число представляет миллисекунды (с 01.01.1970). Так что new Date() + 1 просто добавляет миллисекунду к текущей дате и не добавляет целый день.

Вы можете добавить день, рассчитав количество миллисекунд в дне и добавив это число. Примерно так может работать:

defaultDate: new Date(new Date().getTime() + (1000 * 60 * 60 * 24))

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

EDIT

В своем комментарии вы говорите, что хотите добавить день к dDate в строке dDate.setDate(s_date). Должен ли s_date оставаться на той же дате? Если нет, вы можете добавить день к s_date, используя мой первый метод. Если вы не можете изменить s_date, вам нужно создать новый объект даты и добавить его.

Должно работать что-то вроде ниже (s_date сохранит свое первоначальное значение).

if (s_date > e_date) {
    var newDate = new Date(s_date.getTime());
    newDate.setDate(newDate.getDate() + 1);
    dDate.setDate(newDate);
}
...