Рассчитать количество дней между двумя датами с momentjs

У меня есть две даты, хранящиеся внутри var (созданный средством выбора даты). Для их форматирования я использую moments.js.

Я хочу рассчитать количество дней между этими двумя полями и сохранить это число внутри переменной days. Это мой код до сих пор:

// When someone clicks my submit button, I create an url stored in the var url.
$(".book_submit").on('click', function(e){

  // I get the datepicker and input fields data
  var from = $('.from').val();
  var to = $('.to').val();

  // I can format the "from" var the way I want
  from  = moment(from, "DD.MM.YYYY");
  from = moment(from).format("YYYY-MM-DD");

  // I can format the "to" var the way I want
  to = moment(to, "DD.MM.YYYY");
  to = moment(to).format("YYYY-MM-DD");

  // I want to store the number between the two dates in the var "days", to place it inside my link below. I have found ".diff(to, 'days') in the moments documentation.

  //days = from.diff(to, 'days');   // =1

  var url = "https://mycustomlink&days= " + days + "";

});

Я не могу заставить from.diff(to, 'days') работать и хранить его внутри переменной. Я попытался установить его так:

var days = from.diff(to, 'days');

Как я могу сохранить разницу между этими днями внутри моей переменной days? Я ценю любое предложение.


person Marian Rick    schedule 27.01.2016    source источник


Ответы (2)


Помимо .diff() можно также использовать момент durations: http://momentjs.com/docs/#/durations/

Правка: не знаю, о чем я тогда думал. Спасибо @aedm за указание на это. Здесь нет необходимости в длительности, которая предназначена для создания временных промежутков.

.diff работает так, как задумано, просто вам нужно убедиться, что вы используете правильный формат для разбора дат.

Пример скрипта: https://jsfiddle.net/abhitalks/md4jte5d/

Пример фрагмента:

$("#btn").on('click', function(e) {
	var fromDate = $('#fromDate').val(), 
  		toDate = $('#toDate').val(), 
		from, to, druation;
  
	from = moment(fromDate, 'YYYY-MM-DD'); // format in which you have the date
	to = moment(toDate, 'YYYY-MM-DD');     // format in which you have the date
  
	/* using diff */
	duration = to.diff(from, 'days')     
	
	/* show the result */
	$('#result').text(duration + ' days');
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.1/moment.min.js"></script>
From: <input id="fromDate" type='date' />
To: <input id="toDate" type='date' />&nbsp;&nbsp;
<button id="btn">Submit</button><hr />
<p id="result"></p>


Как я вижу в вашем коде, у вас есть такие комментарии:

// I can format the "from" var the way I want

Нет. Вы не можете отформатировать даты так, как вам нужно. Вы должны использовать формат, в котором находится дата, которую вы анализируете. В моем примере, поскольку я использую дату HTML5, возвращаемая дата находится в формате yyyy-mm-dd, следовательно, используется этот формат. В вашем случае определите, в каком формате ваши текстовые поля возвращают даты, и используйте этот формат.

Вы также можете вообще опустить формат, если уверены, что возвращаемая дата имеет стандартный формат.

person Abhitalks    schedule 27.01.2016
comment
Этот ответ неверен. Попробуйте поиграть с 01.10.2000 и 02.11.2000. - person aedm; 20.06.2016
comment
Чтобы было ясно, duration.days() неверен, потому что он дает вам только часть разницы в днях. Однако to.diff(from, 'days') работает по назначению. - person aedm; 23.06.2016
comment
Спасибо @aedm. Исправил ответ. Не знаю, о чем я тогда думал :/ Должно быть, не спал допоздна и перепутал вещи откуда-то еще!! Спасибо еще раз, если бы не вы, это осталось бы незамеченным. - person Abhitalks; 28.06.2016
comment
Спасибо за исправление. :) - person aedm; 28.06.2016

Чтобы получить разницу в другой единице измерения, передайте это измерение в качестве второго аргумента.

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1

см. это для дальнейшего

person WP Learner    schedule 27.01.2016
comment
Спасибо за ваше предложение! Я нашел это и в документации, но, честно говоря, я даже не знаю, как заменить даты, отображаемые в вашем примере, на мои вары. Вы можете помочь мне с этим? - person Marian Rick; 27.01.2016
comment
Здесь первая переменная — это год, вторая — месяц, а третья — дата. Итак, вам нужно передать два значения относительно. - person WP Learner; 27.01.2016