Дата анализируется по-разному с использованием этих двух методов установки.
При установке даты на 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 будет выполнять арифметические операции, добавляя нужное количество дней и перематывая месяц и год, если необходимо, не лучшая практика, было бы лучше, если бы он бросал).
Решение состоит в том, чтобы всегда устанавливать год, месяц, день, час, минуту в таком порядке, чтобы избежать подобных проблем.
Факт обработки переполнения действительно задокументирован:
http://momentjs.com/docs/#/get -set / date /
Получает или задает день месяца.
Принимает числа от 1 до 31. Если диапазон превышен, он будет увеличиваться до месяцев.
Хотя поведение в таком угловом шкафу, как у вас, действительно удивительно.
Я открыл PR в репозитории документации, где объясняется эта общая проблема.
https://github.com/moment/momentjs.com/pull/244
Да, я не уверен, что это поправимо. Момент не знает, что вы собираетесь установить месяц, поэтому он пытается установить день текущего месяца, который может иметь или не иметь 31. Он игнорирует ваши намерения. Я думаю, PR @ jakub-g - это хорошо; Давайте сделаем это.
Самый полезный комментарий
Обратите внимание, что это
правильно возвращает
2015-10-31
Фактически момент имитирует поведение объекта даты JS.
Сначала вы создаете
moment()
который дает вам текущую дату (3 ноября на сегодняшний день). Вы пытаетесь установить его день равным31
но в ноябре есть только 30 дней, поэтому собственный объект даты JS «разумно» добавляет один день и перемещает дату на 1 декабря (вы можете установить день на любое сумасшедшее число, например 42, и JS будет выполнять арифметические операции, добавляя нужное количество дней и перематывая месяц и год, если необходимо, не лучшая практика, было бы лучше, если бы он бросал).Решение состоит в том, чтобы всегда устанавливать год, месяц, день, час, минуту в таком порядке, чтобы избежать подобных проблем.