Как рассчитать дату 3 месяца на основе заданной даты JavaScript

#javascript #date

#javascript #Дата

Вопрос:

 function change()    {
    var date    =     new Date();
    var dd = date.getDate("startDate");
    var mm = date.getMonth("startDate") 1;
    var yyyy = date.getFullYear("startDate");
    var myDate=yyyy '-' mm '-' dd;
    
    var tmps = new Date(myDate).getTime();
    var newdate = (90*3600*24*1000) tmps;
    var t=new Date(newdate);
    var dd= t.getDate();
    var mm=t.getMonth() 1;
    var yyyy=t.getFullYear();
    var tdate=yyyy '-' mm '-' dd;
    // alert(document.getElementById("endDate").value=tdate);
    return tdate;
}
document.write(change());  

Моя проблема в том, что tdate значение фактически дает YYYY-M-DD значение вместо YYYY-DD-MM .

Комментарии:

1. Вам нужно проверить, меньше ли месяц 9, и добавить 0 мм

2. Спасибо, это сработало, но значение enddate всегда одно и то же

3. ГГГГ-ДД-ММ — это своеобразный формат, который обязательно сбивает с толку подавляющее большинство людей, пытающихся его расшифровать. Ни один из методов Date get не принимает никаких аргументов, поэтому date.getDate("startDate") должно быть date.getDate() , и так далее. Добавление месяцев не является тривиальным, добавление 1 месяца к 31 января приведет к 2 или 3 марта, в зависимости от того, високосный это год или нет.

4. Date.getDate и Date.getMonth не принимают никаких аргументов. Чего вы пытаетесь достичь?

Ответ №1:

Для JavaScript есть библиотека времени под названием Moment. Ваша проблема тривиальна с этим простым синтаксисом:

 var m = moment().add(3,'months').format('YYYY-DD-MM');
alert('Three months from now in YYYY-DD-MM format is:n'   m);  
 <script src="http://momentjs.com/downloads/moment.min.js"></script>  

moment() Конструктор создает текущий момент времени и имеет методы для его обработки и форматирования без всех деталей алгоритмов управления временем, которые требуют отладки и тестирования.

Комментарии:

1. В то время как moment.js это отличная библиотека, ответ не должен полагаться на библиотеку, которая не помечена или не отмечена в OP. 😉

Ответ №2:

В вашем коде у вас есть:

 var tdate = yyyy   '-'   mm   '-'   dd;
  

поэтому вы не должны удивляться, получив гггг-мм-дд. 😉 Измените его на:

 var tdate = yyyy   '-'   dd   '-'   mm;
  

Если вы хотите получить дату, которая составляет 3 месяца с этого момента, вам нужно рассмотреть, что произойдет, когда вы добавите 3 месяца, скажем, до 31 декабря. В более старых версиях ECMAScript 30 ноября 2015 года 3 месяца дали 1 марта 2016 года. Более новые версии не позволят дате превышать месяц, поэтому результатом будет 29 февраля.

Например, в Firefox 49:

 var d = new Date(2015,10,30);
d.setMonth(d.getMonth() 3);
console.log(d); // 1 Mar 2016 or 29 Feb 2016 depending on implementation  

Поскольку вы не можете определить, с какой версией совместим хост, вам нужно будет вручную проверить, перенеслась ли дата или нет:

 function addMonths(date, months) {
  var startMonth = date.getMonth();
  date.setMonth(date.getMonth()   months);
  // If the new month isn't correct, set to last day of previous month
  if ((startMonth    months)%12 != date.getMonth()) {
    date.setDate(0);
  }
  return date
}

var d = new Date(2015,10,31);
addMonths(d, 3);
console.log(d)  

В вашем коде методы Date get не принимают никаких аргументов, поэтому любые предоставленные игнорируются, например

 date.getDate("startDate");
  

должно быть

 date.getDate();
  

и так далее. Также:

 var date = new Date();
  

создаст новую дату на основе смещения часового пояса хоста, однако, когда вы затем создадите строку на основе ее значений ГГГГ-ММ-ДД и выполните:

  var myDate=yyyy '-' mm '-' dd;
  

Она обрабатывается как дата UTC. Для пользователей к западу от Гринвича дата будет отображаться на один день раньше.

Если вы хотите скопировать дату, просто укажите ее в качестве единственного аргумента конструктору Date:

 var tmps = new Date(date);
  

Месяцы должны быть добавлены, как указано выше. В каждом 3-месячном периоде не ровно 90 дней, и в местах, где наблюдается переход на летнее время, не ровно 24 часа в сутки. Таким образом, сочетание факторов означает, что время от времени ваш алгоритм добавления 3 месяцев будет казаться случайным образом неправильным.

Наконец, формат ГГГГ-ДД-ММ наверняка введет в заблуждение подавляющее большинство людей, читающих его. Даты в значительной степени неправильно понимаются, поэтому лучшая стратегия — записать их в однозначной форме с названием месяца, используемым вместо числа. Или, если вы хотите использовать только числовую форму, придерживайтесь хорошо известных стандартов, таких как ISO 8601 ГГГГ-ММ-ДД.

Ответ №3:

 function change(myDate){
    var tmps = new Date(myDate).getTime();
    var newdate = (90*3600*24*1000) tmps;
    var t=new Date(newdate);
    var dd= t.getDate() <10 ? "0" t.getDate() : t.getDate();
    var mm=t.getMonth() 1 <10 ? "0" ( t.getMonth() 1) : t.getMonth() 1;
    var yyyy=t.getFullYear();
    var tdate=yyyy '-' dd '-' mm; 
    alert(tdate);
document.getElementById("tdate").value = tdate;
}
change("2016-7-1"); // ==> 2016-29-09
//change(new Date("2016-8-1"));// ==> 2016-29-30
//change(new Date("2016/08/01"));// ==> 2016-29-10
//change(new Date(2016,(8-1),1));// ==> 2016-29-10  
 <input type='text' id="tdate" value=''/>  

Комментарии:

1. когда я меняю дату начала, тогда и дата окончания 2017-01-18 не меняется соответственно дате начала

2. в вашем коде указано, что вы хотите получить дату через 3 месяца, да?

3. Да, но на основе заданной даты он должен рассчитать 3 месяца, но этого не происходит, когда я меняю дату начала, тогда она тоже не меняется, и я хочу рассчитать на 3 месяца (в месяц 30 дней, а не 31 день или 28 или 29 дней)

4. ответ обновлен, теперь используйте change("any valid date here");