Проблема при изменении даты (изменение неверно) - PullRequest
0 голосов
/ 31 марта 2020

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

Но у меня есть что-то странное, когда я пытаюсь переместить встречу, она кажется работающей, но когда я попробуйте перенести его с 1 апреля на 31 марта, затем дата будет изменена на 1 марта.

Когда я прекращаю свою встречу, я выдаю изменение с данными о своей встрече и новым днем:

drop(evt) {
    let schedule: Schedule;
    schedule = evt.data.schedule;

    // Emit change
    this.scheduleChange.emit({schedule, day: this.day});
  }

Затем я редактирую свое назначение:

  scheduleChanged(evt) {
    const schedule = this.createScheduleFromObject(evt.schedule);
    const day = evt.day;

    console.log(day);

    if (this.isSameDate(schedule.start, schedule.end)) {
      schedule.start.setDate(day.getDate());
      schedule.start.setMonth(day.getMonth())
      schedule.start.setFullYear(day.getFullYear());

      schedule.end.setDate(day.getDate());
      schedule.end.setMonth(day.getMonth());
      schedule.end.setFullYear(day.getFullYear());
      console.log(schedule);
    }
  }

Мне кажется, проблема в том, что я преобразую свой объект в класс расписания:

 createScheduleFromObject(obj: any) {
    const schedule: Schedule = Object.assign(new Schedule(null, '', '', '', new Date(), new Date()), obj);
    console.log(obj.start);
    schedule.start = new Date(obj.start);
    schedule.end = new Date(obj.end);
    console.log(schedule.start);

    return schedule;
  }

Эта функция возвращает правильную дату Вот вывод журнала консоли:

2020-04-01T21:31:49.640Z
Wed Apr 01 2020 23:31:49 GMT+0200

Но когда я изменяю его в функции scheduleChanged, даже если день - 31 марта, как у меня в журнале консоли:

Tue Mar 31 2020 00:00:00 GMT+0200

Дата начала моего расписания установлена ​​на:

Sun Mar 01 2020 23:33:19 GMT+0100

Почему?

1 Ответ

1 голос
/ 31 марта 2020

Я подозреваю, что это дубликат Javascript setMonth показывает неправильную дату . Вероятно, в вашем случае происходит перенос даты на апрель на 31 марта, когда вы устанавливаете день апреля на несуществующую дату, поэтому она переносится на следующий месяц.

При установке значений даты по одному, у вас могут возникнуть проблемы, когда дата начала Дата не существует в установленном месяце. Таким образом, при установке значений даты в новые значения, делайте все это в одном go, вместо:

  schedule.start.setDate(day.getDate());
  schedule.start.setMonth(day.getMonth())
  schedule.start.setFullYear(day.getFullYear());

do:

  schedule.start.setFullYear(day.getFullYear(), day.getMonth(), day.getDate());

Итак, в вашем случае, перенос даты с 1 апреля на 31 марта:

  1. Дата апреля установлена ​​на 31, которая не существует, поэтому переносится на 1 мая
  2. Месяц установлен на март
  3. Год установлен на любое значение

Таким образом, вы получите дату на 1 марта. Установка значений в один go исправляет это так:

  1. (2020-04-01) .setFullYear (2020, 2, 31) -> 2020-03-31

При установке года вы также можете установить месяц и день, при установке месяца вы можете установить месяц и день. Аналогично для времени, установка часов может устанавливать часы, минуты, секунды и миллисекунды. Установка минут может устанавливать минуты, секунды и миллисекунды и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...