Добавление дней на дату с помощью javascript

Я пытаюсь добавить дни к заданной дате с помощью javascript. У меня есть следующий код

function onChange(e) {
    var datepicker = $("#DatePicker").val();
    alert(datepicker);
    var joindate = new Date(datepicker);
    alert(joindate);
    var numberOfDaysToAdd = 1;
    joindate.setDate(joindate + numberOfDaysToAdd);
    var dd = joindate.getDate();
    var mm = joindate.getMonth() + 1;
    var y = joindate.getFullYear();
    var joinFormattedDate = dd + '/' + mm + '/' + y;
    $('.new').val(joinFormattedDate);
}

при первом оповещении я получаю дату 24/06/2011 но при втором предупреждении я получаю Thu Dec 06 2012 00:00:00 GMT+0500 (Pakistan Standard Time) что это неправильно, я хочу, чтобы 24/06/2011 чтобы я мог добавить к нему дни. В моем коде я хочу, чтобы мой конечный результат был 25/06/2011

Скрипка @ http://jsfiddle.net/tassadaque/rEe4v/

11 ответов


Date('string') попытается разобрать строку как m/d/yyyy. Строка становится Dec 6, 2012. Причина: 24 считается месяц... 1 = > январь 2011, 13 = > январь 2012 следовательно 24 => декабрь 2012. Надеюсь, вы понимаете, что я имею в виду. Итак:

var dmy = "24/06/2011".split("/");        // "24/06/2011" should be pulled from $("#DatePicker").val() instead
var joindate = new Date(
    parseInt(dmy[2], 10),
    parseInt(dmy[1], 10) - 1,
    parseInt(dmy[0], 10)
);
alert(joindate);                          // Fri Jun 24 2011 00:00:00 GMT+0500 (West Asia Standard Time) 
joindate.setDate(joindate.getDate() + 1); // substitute 1 with actual number of days to add
alert(joindate);                          // Sat Jun 25 2011 00:00:00 GMT+0500 (West Asia Standard Time)
alert(
    ("0" + joindate.getDate()).slice(-2) + "/" +
    ("0" + (joindate.getMonth() + 1)).slice(-2) + "/" +
    joindate.getFullYear()
);

демо здесь


Я хотел бы призвать вас использовать DateJS библиотека. Это действительно потрясающе!

function onChange(e) {
    var date = Date.parse($("#DatePicker").val()); //You might want to tweak this to as per your needs.
    var new_date = date.add(n).days();
    $('.new').val(new_date.toString('M/d/yyyy'); //You might want to tweak this as per your needs as well.
}

предполагая, что numberOfDaysToAdd - номер:

joindate.setDate(joindate.getDate() + numberOfDaysToAdd);

первое предупреждение-это значение поля. второй-это сгенерированная дата из даты, не отформатированной в США.

вот рабочий пример

(кажется, что такая разметка необходима, чтобы ее заметили)

если вы хотите сохранить свой код, то вам нужно изменить

var joindate = new Date(datepicker);

to

var parms = datepicker.split("/");

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

var joindate = new Date(parms[1]+"/"+parms[0]+"/"+parms[2]);

или тож работает

var joindate = new Date(parms[2],parms[1]-1,parms[0]);

как указано в нескольких других ответах, используйте .getDate ()

joindate.setDate(joindate.getDate() + numberOfDaysToAdd);

наконец вы хотите добавить 0 если месяц

if (mm<10) mm="0"+mm;

если вы используете datepicker из jQuery UI, то вы можете сделать

$('.new').val($("#DatePicker").datepicker( "setDate" , +1 ).val());

вместо функции

http://jqueryui.com/demos/datepicker/#method-setDate

устанавливает текущую дату элемент управления datepicker. Новая дата может быть датой объект или строка в текущей дате формат (например, '01/26/2009'), ряд дней с сегодняшнего дня (например +7) или строка значений и периодов ('y' для годы, " м "- месяцы, " ж " - недели., 'D' Для дней, например, '+1м +7Д'), или null чтобы очистить выбранную дату.


попробовать

function onChange(e) {
        var datepicker = $("#DatePicker").val();
        alert(datepicker);
        var parts = datepicker.split(/[^\d]/);
        var joindate = new Date();
        joindate.setFullYear(parts[2], parts[1]-1, parts[0]);
        alert(joindate);
        var numberOfDaysToAdd = 1;
        joindate.setDate(joindate + numberOfDaysToAdd);
        var dd = joindate.getDate();
        var mm = joindate.getMonth() + 1;
        var y = joindate.getFullYear();
        var joinFormattedDate = dd + '/' + mm + '/' + y;
        $('.new').val(joinFormattedDate);

    }

Я полагаю, проблема в том, что JavaScript ожидает формат MM/DD/YYYY не DD/MM / YYYY при передаче в конструктор даты.


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

вместо .val() использовать:

var joindate = $('#DatePicker').datepicker("getDate");

чтобы получить underyling Date() объект, представляющий выбранную дату непосредственно из jQuery.

Это гарантирует, что объект Date является правильным независимо от формата даты, указанной в DatePicker или текущий локаль.

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

joindate.setDate(joindate.getDate() + numberOfDaysToAdd);

чтобы двигаться дальше.


это опечатка вокруг joindate.setDate (joindate + numberOfDaysToAdd)?

Я пробовал этот код, мне кажется, все в порядке

    var joindate = new Date(2010, 5, 24);
    alert(joindate);
    var numberOfDaysToAdd = 1;
    joindate.setDate(joindate.getDate() + numberOfDaysToAdd);
    var dd = joindate.getDate();
    var mm = joindate.getMonth() + 1;
    var y = joindate.getFullYear();
    var joinFormattedDate = dd + '/' + mm + '/' + y;
    alert(joinFormattedDate);

Date.prototype.addDays = function(days) {
    this.setDate(this.getDate() + days);
    return this;
};

и в вашем коде javascript вы можете вызвать

var currentDate = new Date();
// to add 8 days to current date
currentDate.addDays(8);

function onChange(e) {
    var datepicker = $("#DatePicker").val().split("/");
    var joindate = new Date();
    var numberOfDaysToAdd = 1;
    joindate.setFullYear(parseInt(datepicker[2]), parseInt(datepicker[1])-1, parseInt(datepicker[0])+numberOfDaysToAdd);
    $('.new').val(joindate);
}

http://jsfiddle.net/roberkules/k4GM5/


попробуйте это.

Date.prototype.addDay = function(numberOfDaysToAdd){
    this.setTime(this.getTime() + (numberOfDaysToAdd * 86400000));
};

function onChange(e) {
        var date = new Date(Date.parse($("#DatePicker").val()));
        date.addDay(1);
        var dd = date.getDate();
        var mm = date.getMonth() + 1;
        var y =  date.getFullYear();
        var joinFormattedDate = dd + '/' + mm + '/' + y;
        $('.new').val(joinFormattedDate);
    }

var day = 24*60*60*1000; // One day = 24 hours * 60 min * 60 sec * 1000 mili sec
var numOfDays = 5 * day;
var numOfDaysLaterDate  = new Date((new Date()).valueOf() + numOfDays);