#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");