Click here to Skip to main content
15,886,629 members
Articles / Programming Languages / XML
Technical Blog

Date Counting

Rate me:
Please Sign up or sign in to vote.
5.00/5 (1 vote)
26 Jun 2013MIT1 min read 6.7K  
Date counting

Ok, so I kind of left my previous post a bit incomplete. I did so because there was that bit of date calculation that I wasn't yet done resolving.

Remember this bit of code:

C++
int castedInterval = (int)interval;
int minutes = (castedInterval / 60) % 60;

Ok, so I will be honest that I wasn’t that proud of the date calculations. Especially when you take into consideration that the full implementation looked something like:

C++
-(NSString*) stringFromTimeInterval:(NSTimeInterval) interval
{
    int castedInterval = (int)interval;
    int years = (castedInterval / (((3600 * 24)*7)*52));
    int weeks = (castedInterval / ((3600 * 24)*7));
    int days = (castedInterval / (3600 * 24));
    int hours = (castedInterval / 3600);
    int minutes = (castedInterval / 60) % 60;
    int seconds = castedInterval % 60;

    if (hours >= 24){
        hours = hours - (days * 24);
    }

    if (days >= 7){
        days = days - (weeks * 7);
    }

    if(weeks >= 52) {
        weeks = weeks - (years * 52);
    }
    // removed other code
}

I shivered every time I read that code especially that God awful mess for determining the number of years. I looked at it a few times and thought to myself, ok I could probably clean that up really nice with some constants or some defines.

Ok, who am I kidding it still would look crap!

Regardless of it solving the problem, I still hate ugly code. Mostly because I hear myself saying what I say to so many other software developers.

In five years, when you and I are no longer working here we will be judged by the code we leave behind. For that future developer, let's try and make his job easier.

Quick jump to my favorite research tool and five minutes later, I come up with NSCalendar and NSDateComponents. You can get more information about them here and here.

The cool thing with NSCalendar is that it has a calculations method called components that allows me to pass in 2 NSDate objects to calculate the difference. It then returns back a NSDateComponents which I can then query to get the information I am looking for.

The following is the result:

C++
-(NSString*) stringFromTimeInterval:(NSDate *) 
fromDate toDate:(NSDate *)toDate interval:(NSTimeInterval) interval
{
    NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSUInteger flags =  NSYearCalendarUnit | NSMonthCalendarUnit | 
    NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | 
    NSMinuteCalendarUnit | NSSecondCalendarUnit;
    
    NSDateComponents *dateComponents = [calender components:flags 
    fromDate:[NSDate date] toDate:[self.dueDatePicker date] options:0];
    
    int years = [dateComponents year];
    int months = [dateComponents month];
    int weeks = [dateComponents week];
    int days = [dateComponents day];
    int hours = [dateComponents hour];
    int minutes = [dateComponents minute];
    int seconds = [dateComponents second];

    NSString* result = [[NSString alloc] init];
    if (years > 0) {
        result = (years > 1) ? [result stringByAppendingString:
        [NSString stringWithFormat:@"%d Years ", years]] : 
        [result stringByAppendingString:[NSString stringWithFormat:@"%d Year ", years]];
    }
    
    if (months > 0) {
        result = (months > 1) ? [result stringByAppendingString:
        [NSString stringWithFormat:@"%d Months ", months]] : 
        [result stringByAppendingString:[NSString stringWithFormat:@"%d Month ", months]];
    }
    
    if (weeks > 0) {
        result = (weeks > 1) ? [result stringByAppendingString:
        [NSString stringWithFormat:@"%d Weeks ", weeks]] : 
        [result stringByAppendingString:[NSString stringWithFormat:@"%d Week ", weeks]];
    }
    
    if (days > 0) {
        result = (days > 1) ? [result stringByAppendingString:
        [NSString stringWithFormat:@"%d Days ", days]] : 
        [result stringByAppendingString:[NSString stringWithFormat:@"%d Day ", days]];
    }
    
    if (hours > 0) {
        result = (hours > 1) ? [result stringByAppendingString:
        [NSString stringWithFormat:@"%d Hours ", hours]] : 
        [result stringByAppendingString:[NSString stringWithFormat:@"%d Hour ", hours]];
    }
    
    if (minutes > 0) {
        result = (minutes > 1) ? [result stringByAppendingString:
        [NSString stringWithFormat:@"%d Minutes ", minutes]] : 
        [result stringByAppendingString:[NSString stringWithFormat:@"%d Minute ", minutes]];
    }
    
    if ((years == 0) && (months == 0) && (weeks == 0)) {
        result = [result stringByAppendingString:
        [NSString stringWithFormat:@"%02d Seconds", seconds]];
    }
    
    return result;
}

I am still passing in NSTimeInterval because I am debating whether I want to include the calculation of milliseconds. I couldn’t find milliseconds as a component so the following bit of code should work if I want:

C++
NSTimeInterval actualTimer = interval;
int castedInterval = (int)actualTimer;
int millSeconds = ((double)actualTimer - castedInterval) / .01;

Happy coding everyone.

This article was originally posted at http://dniswhite.com?p=131

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Software Developer
United States United States
I am software developer with over 20 years of professional experience. I have been employed as a software developer since the early 90′s back when Microsoft’s Windows 3.1x was gaining popularity and IBM’s OS/2 was the predominant leader in 32-bit PC based Operating Systems.

Prior to choosing this as my profession I had studied architecture and then later Electrical and Mechanical engineering in college. As a young kid growing up I always played with computers, my first computer was a TRS-80 that I would spend countless hours writing programs for, I never really thought of programming as a profession. The story goes that in my final year of college I took a C/C++ programming class and had so much fun working on the various projects that my professor told me something that changed everything.

“You know they pay people to do stuff like this for a living?” – Professor Bolman

Check out my blog here.

My current and ever evolving projects:

jqAlert javascript alerts done right for those using jQueryUI.
DooScrib Doodle and scribble pad written in javascript for use with HTML5 Canvas.

Comments and Discussions

 
-- There are no messages in this forum --