Кровавый случай, вызванный новой датой ()

JavaScript

src=http___hbimg.b0.upaiyun.com_e347f36b660959525fdf01f85b7a4d63f70f1251389b5-KmRYO4_fw658&refer=http___hbimg.b0.upaiyun.jpeg

  • задний план

    • Остался всего один день до выхода в интернет.Когда я вышел с работы ночью, ко мне в спешке подошла наша тест-леди.Была проблема с плагином даты.Проект был взят напрямую,и он запущен онлайн в течение длительного времени, так почему же проблема все еще существует?
    • Испытайте Модзи, пусть маленькая сестра, а затем узнайте небольшую проблему, исходная инициализация плагина - март, щелкнув в следующем месяце, когда прыгнет прямо в май, и его лицо может звучать невежественной силой, есть такая волшебная ошибка, действительно ошибка, как столь же полный чудес.
  • Проверить

    • Я начал исследовать и, наконец, обнаружил, что это проблема новой даты(), потому что дата по умолчанию — 31 марта, поэтому время новой даты() — 2021-3-31, и проблема заключается в этом 31.
  • принцип

    • Создать JavaScriptDateЭкземпляр, отображающий момент времени.Dateобъект основан наUnix Time StampТо есть с 1 января 1970 года количество миллисекунд, пройденное UTC.

    • Конструктор Date() имеет четыре основные формы

      • new Date();  //如果没有提供参数,那么新创建的Date对象表示实例化时刻的日期和时间。
        new Date(value);  //一个 Unix 时间戳(Unix Time Stamp),它是一个整数值,表示自1970年1月1日00:00:00 UTC(the Unix epoch)以来的毫秒数,忽略了闰秒。请注意大多数 Unix 时间戳功能仅精确到最接近的秒
        new Date(dateString); //表示日期的字符串值。该字符串应该能被 Date.parse() 正确方法识别
        new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);//当至少提供了年份与月份时,这一形式的 Date() 返回的 Date 对象中的每一个成员都来自下列参数。没有提供的成员将使用最小可能值(对日期为1,其他为0)。
        //参数monthIndex 是从“0”开始计算的,这就意味着一月份为“0”,十二月份为“11”。
        
    • В настоящее время проблема заключается в новой дате (год, месяц, день), а время, полученное новой датой (2021,3,31), оказывается (сб, 01 мая 2021 г., 00:00:00 по Гринвичу + 0800 ( Китайский стандарт) время)) 1 мая 2021.

    • Примечание ПараметрыmonthIndexотсчитывается от «0», что означает «0» для января и «11» для декабря.

    • Прежде всего, нам нужно знать, что при использовании формата new Date(2021,3,31) для передачи в параметрах месяц будет автоматически добавляться на 1, чтобы получить реальный месяц, то есть, если март передан в , то апрель получится. .

    • **Примечание.** Когда Date вызывается как конструктор и передается несколько параметров, если значение превышает разумный диапазон (например, 13 для месяца или 70 для минуты), соседние значения будут скорректировано. Например, новая дата (2013, 13, 1) равна новой дате (2014, 1, 1), которые оба представляют дату 2014-02-01 (обратите внимание, что месяц начинается с 0). Другие значения аналогичны, новая дата (2013, 2, 1, 0, 70) равна новой дате (2013, 2, 1, 1, 10), оба представляют одно и то же время:2013-03-01T01:10:00. (из МДН)

    • Поэтому, когда новая дата (2021,3,31), поскольку в марте 31 день, а в апреле нет 31-го дня, значение превышает разумный диапазон, а соседнее значение корректируется до 1 мая.

  • решение

    • Проще всего настроить формат параметра, то есть новая дата(ГГГГ,ММ,ДД) меняется на новую дату(ГГГГ-ММ-ДД), но этот формат слишком сильно меняется в моем коде проекта и не подходит для моего текущая ситуация.

    • Так как она связана с количеством дней и месяцев каждого месяца, то решите эту задачу от количества месяцев и дней текущего месяца, то есть следующие решения

      • var currentDay; //当前月份天数
        var currentMonthDays = new Date(year, month, 0).getDate(); //拿到当前月份的天数
        var nextMonthDays = new Date(year, month + 1, 0).getDate();  //拿到下一月份的天数
        var days = currentDay > nextMonthDays? nextMonthDays: currentDay; //进行比较,如果当前月份天数大于下一月份天数,则days等于下一个月份的天数,否则为当前月份天数
        new Date(that.year, that.month, days);
        //即可解决此问题
        

Я ученый, маленькая волна во фронтовой волне.