2010-11-08 5 views
11
var inputDate  = '20/4/2010'.split('/'); 
var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0])); 

var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year); 

Это код Javascript, который я использую для выработки даты истечения срока действия с учетом введенной пользователем даты. В настоящее время срок действия - original date minus one day and original year minus X.Вычитание дней/месяцев/лет с объекта даты

Проблемы с этим кодом, во-первых, не учитывают недопустимые даты. Например, если дата поставки пользователя «1/10/2010», дата истечения срока действия будет «0/10/2013» (при условии, что срок действия составляет +3 года).

я мог бы сделать что-то вроде: возникают

var inputDate = '20/4/2010'.split('/'); 
var day  = parseInt(inputDate[0]); 
var month  = parseInt(inputDate[1]); 
var year  = parseInt(inputDate[2]); 

if (day < 1) 
{ 
    if (month == ...) 
    { 
     day = 31 
     month = month - 1; 
    } 
    else 
    { 
     day = 30 
     month = month - 1; 
    } 
} 

var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0])); 
var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year); 

Но больше проблем ... Во-первых, код становится немного запутанным. Во-вторых, эта проверка должна быть сделана в тот же день. а затем месяц. Есть ли более чистый, более простой способ?

Кроме того, существует определенное обстоятельство, которое потребует от меня вычисления даты истечения срока действия до «конца месяца» на эту дату. Например:

Expiry date is: +3 years 

User date is: '14/10/2010' 
Expiry date is: '31/10/2013' 

Я надеялся на Date object будет поддерживать эти расчеты, но в соответствии с https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date, кажется, не ...

+0

momentjs.com делает этот способ проще: http://momentjs.com/ – bernie2436

ответ

3
var currentDate = new Date(year,month,day); 
var expiryDate = new Date(); 
expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000)); 

используя количество секунд, прошедших 1970 отлично подходит для этого: -) о, у вас больше правил. а после того, что вы все равно должны проверить в тех случаях ...

+1

К сожалению, я не совсем уверен, как это работает ... Что представляет собой каждый номер? Как бы я вычислил +4 года на вершине определенной даты, используя это? – dave

11

Легкий способ увидеть, если дата является занесены действительной датой:

var d = Date.parse('4/20/2010'); 
if (isNaN(d.valueOf())) { 
alert ("bad date value"); 
} 

Затем, это функция dateAdd, которую я использую регулярно. Расширяет объект Date, поэтому его легко использовать:

Date.prototype.dateAdd = function(size,value) { 
    value = parseInt(value); 
    var incr = 0; 
    switch (size) { 
     case 'day': 
      incr = value * 24; 
      this.dateAdd('hour',incr); 
      break; 
     case 'hour': 
      incr = value * 60; 
      this.dateAdd('minute',incr); 
      break; 
     case 'week': 
      incr = value * 7; 
      this.dateAdd('day',incr); 
      break; 
     case 'minute': 
      incr = value * 60; 
      this.dateAdd('second',incr); 
      break; 
     case 'second': 
      incr = value * 1000; 
      this.dateAdd('millisecond',incr); 
      break; 
     case 'month': 
      value = value + this.getUTCMonth(); 
      if (value/12>0) { 
       this.dateAdd('year',value/12); 
       value = value % 12; 
      } 
      this.setUTCMonth(value); 
      break; 
     case 'millisecond': 
      this.setTime(this.getTime() + value); 
      break; 
     case 'year': 
      this.setFullYear(this.getUTCFullYear()+value); 
      break; 
     default: 
      throw new Error('Invalid date increment passed'); 
      break; 
    } 
} 

Затем просто использовать:

var d = new Date(); 
d.dateAdd('day', -1).dateAdd('year', 3); 

T'da

+0

Я думаю, что этот ответ - лучшее решение, и дата, когда вы разбираете в этом примере, - это небольшое обледенение на торте. Благодаря! – TaeKwonJoe

+0

Просто побочный комментарий, валидация хороша, однако не называйте прототип с анализируемой переменной d. Очевидно, вам нужно создать экземпляр этого объекта Date. В противном случае вы получите тупые ошибки, «dateAdd, не существует». var d = Date(); d.dateAdd ('день', -1).dateAdd ('год', 3); – MiloTheGreat

+0

Я думаю, что это неправильное решение. Я хотел, чтобы человек был старше, чем 18 лет, основанный на дате рождения. попытался вычесть 18 лет с текущей даты (28 марта 2014 года), это решение было возвращено 28 февраля 1996 года. Я пересекаю проверенный ответ от http://www.timeanddate.com/date/dateadded.html?d1=28&m1=3&y1=2014&type=sub&ay=18&am=&aw=&ad= и HTTP: // WWW. calculator.net/date-calculator.html?today2=03%2F28%2F2014&c2op=-&c2year=18&c2month=0&c2week=0&c2day=0&calctype=op&x=98&y=11 дата я получил 28-марта-1996 Я думаю, что чего-то не хватает. –

5

Аналогичный вопрос был дан ответ здесь:

How to add/subtract dates with javascript?

Аналогичная вещь может быть выполнена в течение нескольких месяцев и лет.

Для примера.

 var date = new Date('2011','01','02'); 
    alert('the original date is '+date); 
    var newdate = new Date(date); 
    newdate.setMonth(newdate.getMonth() - 7); 
    var nd = new Date(newdate); 
    alert('the new date is '+nd);