Using NSDate to find time spent in background - nsdate

I would like to be able to have a NSDate created when a button is pressed. Then, when the app enters sleep mode, and the user returns after a random amount of time, I compare the current time to the NSDate saved to find how much time to add to a NSTimer. So far, I have a created a NSDate in my button pressed method:
NSDate *test = [NSDate date];
I need help figuring out how to calculate the time since the NSDate in minutes and then put that info in a int. Any thoughts?

// before sleeping
NSDate *startTime = [NSDate date];
// when waking up
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:startTime];

Related

How do you get the seconds since a past date to now?

How can I get the seconds that have passed since 1980-01-01 00:00:00 +1100 using NSTimeInterval?
// I need the function to use something like and am having an issue
NSDate *aDate = (NSDate*)#"1980-01-01 00:00:00 +1100";
NSDate *seconds = [NSDate dateWithTimeInterval:60*60*24 sinceDate:aDate];
NSLog(#"seconds since Jan 1980 %#",seconds);
// I am trying to replace the following
//NSTimeInterval dateinterval = [[NSDate date] timeIntervalSince1970];
NSTimeInterval dateinterval = seconds;
NSDate only retrieves the GMT at +0000 which is not helpful in real world applications. Local dates are mandatory.
Is this too hard or can it not be done this way?
You are initializing your NSDate object wrong. You can't directly cast an NSString as an NSDate, you need to use NSDateFormatter:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = #"yyyy-MM-dd HH:mm:ss z";
NSDate *aDate = [formatter dateFromString:#"1980-01-01 00:00:00 +1100"];
NSDate *now = [NSDate date];
NSTimeInterval seconds = [now timeIntervalSinceDate:aDate];
To format the date for a different time zone, use a new NSDateFormatter and set its local and timeZone.

Schedule a UILocalNotification every day at the same time

I want to fire a UILocalNotification every day at 6:00, 9:00, 12:00 for the next 20 days.
I realize that this question is a very basic question, I would try to accomplish this with NSDateComponents, but then I realized that I could get problems when a month just has 28 days or the year changes. Thats why I ask: Has someone experience with such a task and could give me some hints?
Create three different local notification with repeatInterval.
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = date; // Specifly date and time for notification
localNotification.repeatInterval = NSCalendarUnitDay;
localNotification.alertBody = #"Notification";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
At time of 20 days cancel those notification.
[[UIApplication sharedApplication] cancelAllLocalNotifications];
or
[[UIApplication sharedApplication] cancelLocalNotification:NOTIFICATION_ID];

Update a Label daily with new text

I have a label I want to update daily and automatically? in some specific time. How could the code be.. I have searched every where about how to updating the label daily.
the NSdate and NStimer label working . And also datepicker if the user want to look at forward events.
I think it is something with, 'if' the date is.. }else{... and something like that
Thanks
edit:
If I already have these codes in my app then there will be something wrong
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
NSDate *nowDate = [NSDate date];
self.currentDateLabel.text = [dateFormatter stringFromDate:nowDate];
Try this code for any comparison between dates... You should not compare date in the form of string. Compare the dates before conversion to string. Convert the self.serverDate into date format using dateFromString function of the formatter by specifying the exact date format as that of the dateString. Then compare the dates using following function.
-(void) callAfterSixtySecond:(NSTimer*) t
{
NSDate *today = [NSDate date]; // current date
NSDate *newDate = self.serverDate; // other date
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:#"HH:mm"];
NSDate *todayTime = [formatter dateFromString:[formatter stringFromDate:today]];
NSDate *requiredTime = [formatter dateFromString:[formatter stringFromDate:newDate]];
NSComparisonResult result;
result = [todayTime compare:requiredTime ]; // comparing two dates
if(result == NSOrderedAscending)
NSLog(#"today is less");
else if(result == NSOrderedDescending)
NSLog(#"newDate is less");
else if(result == NSOrderedSame)
NSLog(#"Both dates are same"); // time has reached. Update Label using setText method of label
else
NSLog(#"Date cannot be compared");
}
You will need to run this method every minute using an NSTimer...
NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 60.0 target: self
selector: #selector(callAfterSixtySecond:) userInfo: nil repeats: YES];

NSDateFormatter reports June 2, 2013 as being in week zero

I am using NSDateFormatter to convert a series of dates to a week number within a month.
The date formatting code I am using is yyyyMMW and everything I have read tells me that W will be between 1-5.
But, the 2nd of June 2013 fell on a Sunday (the default start day of the week in the gregorian calendar) and it's week number is reported as 0 even though the start date of the week is calculated correctly:
2013-06-03 14:15:45.611 date=20130531, week=2013055, start of week=20130526
2013-06-03 14:15:45.612 date=20130602, week=2013060, start of week=20130602
2013-06-03 14:15:45.612 date=20130603, week=2013061, start of week=20130602
Some quick and dirty test code to reproduce the log shown above:
NSDateFormatter *dateFormatDaily = [[NSDateFormatter alloc] init];
[dateFormatDaily setDateFormat:#"yyyyMMdd"];
NSDateFormatter *dateFormatterWeekly = [[NSDateFormatter alloc] init];
[dateFormatterWeekly setDateFormat:#"yyyyMMW"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setFirstWeekday:1]; // default but set here for clarity
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setMonth:5];
[dateComponents setDay:31];
[dateComponents setYear:2013];
NSDate *date_1 = [calendar dateFromComponents:dateComponents];
[dateComponents setMonth:6];
[dateComponents setDay:2];
NSDate *date_2 = [calendar dateFromComponents:dateComponents];
[dateComponents setDay:3];
NSDate *date_3 = [calendar dateFromComponents:dateComponents];
NSArray *datesToTest = #[date_1, date_2, date_3];
for (NSDate *date in datesToTest) {
NSString *weekNo = [dateFormatterWeekly stringFromDate:date];
NSDate *beginningOfWeek = nil;
BOOL rc = [calendar rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate:date];
if (rc) {
NSLog(#"date=%#, week=%#, start of week=%#", [dateFormatDaily stringFromDate:date], weekNo, [dateFormatDaily stringFromDate:beginningOfWeek]);
} else {
NSLog(#"Could not calculate beginning of week");
}
}
Any ideas? A week number of 0 under any circumstances seems wrong to me.
Thanks
There are various parameters that cause this effect. First of all, you did not set a calendar for the date formatter. If you add
[dateFormatterWeekly setCalendar:calendar];
to your code, then the output will be as you expected:
date=20130531, week=2013055, start of week=20130526
date=20130602, week=2013062, start of week=20130602
date=20130603, week=2013062, start of week=20130602
But in your case, the date formatter uses the current calendar, and therefore has separate parameters firstWeekDay and minimumDaysInFirstWeek. These parameters are locale dependent. If I test this on the iOS Simulator with the "Region Format" set to "German -> Germany", then
[[dateFormatterWeekly calendar] firstWeekday] = 2
[[dateFormatterWeekly calendar] minimumDaysInFirstWeek] = 4
and I assume that you will have similar values, because now I get the same output as you.
Now for the date formatter, the week starts on a Monday, which means that June 2 is in the week starting at May 27. This counts as "week #0" in June, because only one day of this week is in June, but minimumDaysInFirstWeek = 4. The first week in a month that has at least
minimumDaysInFirstWeek days, counts as "week #1".
(I found the relevance of the minimumDaysInFirstWeek parameter here:
http://www.cocoabuilder.com/archive/cocoa/326845-week-of-month-confusion.html)

how can I add one minutes in current NSDate of iphone and save in NSDate?

I can get current date of iphone via this code as
NSDate *currentDate = [NSDate date];
NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
[dateFormatter1 setDateFormat:#"yyyy-MM-dd HH:mm"];
NSString *dateString = [dateFormatter1 stringFromDate:currentDate];
Now I just want to increase one mint then save NSString format,
how can I?
You can use dateByAddingTimeInterval.
NSDate *currentDate = [NSDate date];
NSDate *datePlusOneMinute = [currentDate dateByAddingTimeInterval:60];
//60 seconds
Or even shorter:
Objective-C
//60 seconds
[NSDate dateWithTimeIntervalSinceNow:60];
Swift
//60 seconds
NSDate(timeIntervalSinceNow: 60)

Resources