Search code examples
javascriptdatetimetwitter-bootstrapdatejs

How to add or subtract dates, days,months in bootstrap datetime widget?


I am using a Bootstrap DateTime widget in my template, I have placed 2 widgets (From, To) side by side to select a particular range of dates, hours, or months according to need. I have linked both widgets, so that user may always choose the "To" range lesser than "From". For that purpose I have added or subtracted the dates by numbers like:

        var evDate = ev.date;
        if (evDate != null) {
            $('.'+reportCategoryTo.id).
                        datetimepicker('setStartDate', evDate);
            var evDateObject = new Date(evDate.valueOf());
            var reportDateTimeCategoryFrom = report_date_time_category[0][0];
            var reportDateTimeCategoryTo = report_date_time_category[1][0];
            if (reportDateTimeCategoryFrom.category.indexOf("Daily") !== -1) {
                var newDate = evDateObject.setDate(evDateObject.getDate() + 31);
            }
            else if (reportDateTimeCategoryFrom.category.indexOf("Monthly") !== -1) {
                var newDate = evDateObject.setDate(evDateObject.getDate() + 365);
            }
            else {
                var newDate = evDateObject.setDate(evDateObject.getHours() + 24);
            }

            var newDateObject = new Date(newDate);
            $('.'+reportCategoryTo.id).
                        datetimepicker('setEndDate', newDateObject);
            }
        else {
            console.log('The change is null',evDate);
            $('.'+reportCategoryTo.id).
                            datetimepicker('setStartDate', null);
            $('.'+reportCategoryTo.id).
                            datetimepicker('setEndDate', null);
            }
        });

This does'nt show the range when user chooses like 30th of may or something similar. I then Found Datejs which helps in adding or subtracting dates and etc. I used Datejs like this:

            if (reportDateTimeCategoryFrom.category.indexOf("Daily") !== -1) {
                var newDate = evDateObject.setDate(evDateObject.getDate().add(31).days());
            }
            else if (reportDateTimeCategoryFrom.category.indexOf("Monthly") !== -1) {
                var newDate = evDateObject.setDate(evDateObject.getDate().add(365));
            }
            else {
                var newDate = evDateObject.setDate(evDateObject.getHours().addHours(24));

But my console prompts this error:

TypeError: evDateObject.getDate(...).add is not a function

I have Imported the date.js file but even then this is'nt working. Please Help!


Solution

  • Datejs is abandoned, I wouldn't recommend using it. Read here.

    You might want to consider Moment.js, which also has functions for datetime arithmetic.

    For example:

    var m = moment(evDateObject.getDate());
    m.add('months', 1);
    evDateObject.setDate(m.toDate());