<p>moment.date ($ day) .month ($ month) .year ($ year) ведет себя иначе, чем moment ([$ year, $ month, $ date])</p>

Созданный на 2 нояб. 2015  ·  4Комментарии  ·  Источник: moment/moment

Дата анализируется по-разному с использованием этих двух методов установки.
При установке даты на October 31, 2015 . Связанный метод возвращает 2015-10-01 а метод init возвращает 2015-10-31

var year = 2015;
var month = 9; //october
var day = 31;

console.log(moment().date(day).month(month).year(year).format('YYYY-MM-DD'));
//2015-10-01

console.log(moment([year, month, day]).format('YYYY-MM-DD'));
//2015-10-31

JS Fiddle: http://jsfiddle.net/dgnjer7z/

Самый полезный комментарий

Обратите внимание, что это

$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));

правильно возвращает 2015-10-31

Фактически момент имитирует поведение объекта даты JS.

Сначала вы создаете moment() который дает вам текущую дату (3 ноября на сегодняшний день). Вы пытаетесь установить его день равным 31 но в ноябре есть только 30 дней, поэтому собственный объект даты JS «разумно» добавляет один день и перемещает дату на 1 декабря (вы можете установить день на любое сумасшедшее число, например 42, и JS будет выполнять арифметические операции, добавляя нужное количество дней и перематывая месяц и год, если необходимо, не лучшая практика, было бы лучше, если бы он бросал).

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

Все 4 Комментарий

Обратите внимание, что это

$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));

правильно возвращает 2015-10-31

Фактически момент имитирует поведение объекта даты JS.

Сначала вы создаете moment() который дает вам текущую дату (3 ноября на сегодняшний день). Вы пытаетесь установить его день равным 31 но в ноябре есть только 30 дней, поэтому собственный объект даты JS «разумно» добавляет один день и перемещает дату на 1 декабря (вы можете установить день на любое сумасшедшее число, например 42, и JS будет выполнять арифметические операции, добавляя нужное количество дней и перематывая месяц и год, если необходимо, не лучшая практика, было бы лучше, если бы он бросал).

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

Факт обработки переполнения действительно задокументирован:

http://momentjs.com/docs/#/get -set / date /

Получает или задает день месяца.

Принимает числа от 1 до 31. Если диапазон превышен, он будет увеличиваться до месяцев.

Хотя поведение в таком угловом шкафу, как у вас, действительно удивительно.

Я открыл PR в репозитории документации, где объясняется эта общая проблема.
https://github.com/moment/momentjs.com/pull/244

Да, я не уверен, что это поправимо. Момент не знает, что вы собираетесь установить месяц, поэтому он пытается установить день текущего месяца, который может иметь или не иметь 31. Он игнорирует ваши намерения. Я думаю, PR @ jakub-g - это хорошо; Давайте сделаем это.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги