Compare two NSDates - cocoa

How can I compare two NSDates and return the amount of time between them.
For example:
2010-06-20 14:29:41 -0400
2010-06-20 14:53:29 -0400
should return something like: 23 or 24(minutes), rounding the seconds because I don't really need the seconds.

try something like:
int intervall = (int) [date1 timeIntervalSinceDate: date2] / 60;

Here the complete snippet to compare two NSDate which you may find more useful based on your query.
NSCalendar *myCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSString *str =#"12:15, 01 15 2012 AM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:#"hh:mm, dd MM yy a"];
NSDate *refDate = [formatter dateFromString:str];
NSDate *today = [NSDate date];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
NSDateComponents *difference = [myCal components:unitFlags fromDate:refDate toDate:today options:0];
NSLog(#"%#",difference);
------------------------------what you will get is -----------------------------------------
Calendar Year: 0 Month: 0 Day: 0 Hour: 1 Minute: 19

Related

Get first day in a month from NSCalendar

I have this subset of a method that needs to get day one of the current month.
NSDate *today = [NSDate date]; // returns correctly 28 february 2013
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = 1;
NSDate *dayOneInCurrentMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
dayOneInCurrentMonth then prints out 2013-03-01 09:53:49 +0000, the first day of the next month.
How do I get day one of the current month?
Your logic is wrong: Instead of setting the date's day to 1, you're adding a day to the current date.
Try something like that:
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [gregorian components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:today];
components.day = 1;
NSDate *dayOneInCurrentMonth = [gregorian dateFromComponents:components];
You want [NSCalender dateFromComponents:] instead:
NSDate *dayOneInCurrentMonth = [gregorian dateFromComponents:components];
Easy way of getting to the 1st from a given date:
NSDate *first = [gregorian dateBySettingUnit:NSCalendarUnitDay value:1 ofDate:date options:0];
Easy Way to get first and last date of previous month is :
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay ) fromDate:[NSDate date]];
//TO GET PREVIOUS MONTH LAST DAY
[comp setMonth:[comp month]];
[comp setDay:1];
NSDate *tDateMonth = [gregorian dateFromComponents:comp];
NSLog(#"LAST DAY OF PREVIOUS MONTH ; %#", tDateMonth);
//TO GET PREVIOUS MONTH FIRST DAY
[comp setMonth:[comp month]-1];
[comp setDay:3];
NSDate *td = [gregorian dateFromComponents:comp];
NSLog(#"FIRST DAY OF PREVIOUS MONTH ; %#", td);
Hope this helps
By creating new variable is expensive on memory usage, it's better using date formatter to get the first day of the current month
today = [NSDate date];
firstDayDateFormatter = [[NSDateFormatter alloc] init];
[firstDayDateFormatter setDateFormat:#"01-MM-yyyy"];
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"dd-MM-yyyy"];
[dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:#"en_US"]];
firstDayOfTheMonth = [mdfDateFormat dateFromString:[firstDayDateFormatter stringFromDate:today]];
NSDate *startDate = nil;
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitMonth startDate:&startDate interval:NULL forDate:date];
return startDate;

NSDate hours are not correct after constructing date from components

I'm trying to construct a date from two different dates. When I break down both dates into their respective components and re-assemble them into the new date.. everything seems to be correct except the hours. Im sure its something simple that has to do with the timezone or the NSGregorianCalendar, but I am new to iOS, and programming NSCalendar. Im hoping someone will catch the simple mistake Im making.
//grab today's date so we can brek it down into components
NSDate *todayDate = [NSDate date];
NSLog(#"Todays Date: %#", todayDate);
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
//break down the stored date into components
NSDateComponents *theTime = [gregorian components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:storedIncorrectDate];
NSLog(#"Incorrect Calendar Components %#", theTime);
NSDateComponents *todayCalendarComponents = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:todayDate];
NSInteger currentYear = [todayCalendarComponents year];
NSLog(#"The Year: %i", currentYear);
NSInteger currentMonth = [todayCalendarComponents month];
NSLog(#"The Month: %i", currentMonth);
NSInteger currentDay = [todayCalendarComponents day];
NSLog(#"The Day: %i", currentDay);
NSLog(#"Today's Calendar Components %#", todayCalendarComponents);
NSInteger theHours = [theTime hour];
NSLog(#"Hours: %i", theHours);
NSInteger theMinutes = [theTime minute];
NSLog(#"Minutes: %i", theMinutes);
NSInteger theSeconds = [theTime second];
NSLog(#"Seconds: %i", theSeconds);
//build my new date and store it before we play the affirmation.
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setHour:theHours];
[components setMinute:theMinutes];
[components setSecond:theSeconds];
[components setYear:currentYear];
[components setMonth:currentMonth];
[components setDay:currentDay];
[components setTimeZone:[NSTimeZone localTimeZone]];
NSLog(#"The Components: %#", components);
NSCalendar *updatedCal = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *revisedCorrectedDate = [updatedCal dateFromComponents:components];
NSLog(#"The Hours: %i", theHours);
NSLog(#"The New and Corrected Date: %#", revisedCorrectedDate);
The result of the log printing the revisedCorrectedDate shows everything correct that I set except the hours. This has to be a simple fix.. I just don't see it. Thank you in advance!
Are you sure it's incorrect? When I run this code, I get:
2012-06-03 18:13:36.130 Untitled[39805:707] The New and Corrected
Date: 2012-06-04 01:13:36 +0000
It's currently 6/3/12 18:13:36 here, and the date displayed is 6/4/12 01:13:36, which is the correct time, in UTC (notice the +0000 at the end).

Set the time of the DatePicker

How do I set the time of the DatePicker at 00:00:00 of the current date?
- (void) awakeFromNib
{
[datePicker setDateValue:[NSDate date]];
NSDate *now = [NSDate date];
int daysToAdd = 364;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];
[datePicker1 setDateValue:newDate1];
}
cringe
It looks like you have two different datePickers? datePicker and datePicker1? What's up with that?
Also, this does not do what you're expecting:
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*364];
That is creating a new date that is exactly 31,449,600 seconds in the future. It is not doing anything other than that.
What you want to do is extract all of the date components from the current date and zero them out:
NSDate *now = [NSDate date];
NSDateComponents *nowComponents = [[NSCalendar currentCalendar] components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:now];
// technically these next lines are unnecessary, since we only pulled out the era-year-month-day, but they're included here for understanding/completeness:
[nowComponents setHour:0];
[nowComponents setMinute:0];
[nowComponents setSecond:0];
// now we can turn it back into a date:
NSDate *todayAtMidnight = [[NSCalendar currentCalendar] dateFromComponents:nowComponents];

How do you extract number of current date in Cocoa?

How to extract the number of current month-day in Cocoa?
That's how I do this but it returns something like 309420938420422..
thanks!
-(int)getNumberOfCurrentDay:(NSDate*)date_
{
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSMonthCalendarUnit fromDate:date_];
NSInteger numberday = [comps day];
NSLog(#"Number of the day %i", numberday);
return numberday;
}
You need to use: NSDayCalendarUnit
-(int)getNumberOfCurrentDay:(NSDate*)date_
{
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSDayCalendarUnit fromDate:date_];
NSInteger numberday = [comps day];
NSLog(#"Number of the day %d", numberday);
return numberday;
}
Try using NSDayCalendarUnit instead of NSMonthCalendarUnit. Or do the following to get more(days, months, years, hours, minutes, seconds, etc.):
int comp = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *theDateComponents = [gregorian components:comp fromDate:date_];
int day = [theDateComponents day];
Hope it helps

How to create a specific date in the distant past, the BC era

I’m trying to create a date in the BC era, but failing pretty hard. The following returns ‘4713’ as the year, instead of ‘-4712’:
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [NSDateComponents new];
[components setYear: -4712];
NSDate *date = [calendar dateFromComponents:components];
NSLog(#"%d", [[calendar components:NSYearCalendarUnit fromDate: date] year]);
Any idea what I’m doing wrong?
UPDATE: Working code
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [NSDateComponents new];
[components setYear: -4712];
NSDate *date = [calendar dateFromComponents:components];
NSDateComponents *newComponents = [calendar components:NSEraCalendarUnit|NSYearCalendarUnit fromDate:date];
NSLog(#"Era: %d, year %d", [newComponents era], [newComponents year]);
This prints 0 for the era, just as Ben explained.
Your code is actually working fine. Since there’s no year zero, -4712 is the year 4713 BC. If you check the era component you’ll see that it’s zero, which in the Gregorian calendar indicates BC. Flip that negative sign and you’ll see 4712 AD (era 1).

Resources