Вычитание дней / месяцев / лет из объекта Date - PullRequest
11 голосов
/ 08 ноября 2010
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,, похоже, нет ...

Ответы [ 4 ]

11 голосов
/ 08 ноября 2010

Простой способ узнать, является ли введенная дата действительной:

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

5 голосов
/ 02 декабря 2013

Здесь был дан ответ на похожий вопрос:

Как сложить / вычесть даты с помощью 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);
3 голосов
/ 08 ноября 2010
var currentDate = new Date(year,month,day);
var expiryDate = new Date();
expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000));

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

0 голосов
/ 08 ноября 2010

Может быть, это будет вам полезно: http://code.google.com/p/datejs/wiki/APIDocumentation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...