views:

9587

answers:

6

I'm creating an application which lets you define events with a time frame. I want to automatically fill in the end date when the user selects or changes the start date. I can't quite figure out, however, how to get the difference between the two times, and then how to create a new end Date using that difference.

+5  A: 

In JavaScript, dates can be transformed to the number of milliseconds since the epoc by calling the getTime() method or just using the date in a numeric expression.

So to get the difference, just subtract the two dates.

To create a new date based on the difference, just pass the number of milliseconds in the constructor.

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

This should just work

EDIT: Fixed bug pointed by @bdukes

Vincent Robert
+1  A: 

If you use Date objects and then use the getTime() function for both dates it will give you their respective times since Jan 1, 1970 in a number value. You can then get the difference between these numbers.

If that doesn't help you out, check out the complete documentation: http://www.w3schools.com/jsref/jsref_obj_date.asp

Kamikaze Mercenary
+2  A: 

If you don't care about the time component, you can use .getDate() and .setDate() to just set the date part.

So to set your end date to 2 weeks after your start date, do something like this:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

To return the difference (in days) between two dates, do this:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

Finally, let's modify the first function so it can take the value returned by 2nd as a parameter:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}
Joel Coehoorn
+1  A: 

Thanks @Vincent Robert, I ended up using your basic example, though it's actually newBegin + oldEnd - oldBegin. Here's the simplified end solution:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }
bdukes
A: 

quite confusing.. but still helpful.. thanx...

This should really be a comment.
Ian Robinson
A: 

Hi,

I have tried to get date difference as below but never getting the proper date difference

//I am testing this on 2010-01-07

var d1 = new Date("2010", "01", "30"); // creates a new Date for the 1st June 2005 var d2 = new Date(); // creates a new Date representing today

var milli_d1 = d1.getTime(); var milli_d2 = d2.getTime(); var one_day = 60 * 60 * 24 * 1000;

var num_days_d1 = d1.getTime() / one_day; var num_days_d2 = d2.getTime() / one_day; var num_days = num_days_d1 - num_days_d2

And the num_days results with value 53.3578278819459

which should be 24 days

Can any one please show me the error above to get proper date difference

Thanks Regards Leelu

leeladharan
@leeladharan, Welcome to Stack Overflow. You may want to look at the FAQ (http://stackoverflow.com/faq) before you do much other posting. You should ask this as a new question, rather than asking your question as an "answer" to this question. Stack Overflow isn't designed as a forum, but prefers a focussed question and answer format.Hope that helps!
bdukes
@bdukes: +1 for teaching, not critiquing...
Neil T.