how do I set an existing NSDate's time?
Solution 1
NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date];
[components setHour: 7];
[components setMinute: 59];
[components setSecond: 17];
NSDate *newDate = [gregorian dateFromComponents: components];
I use NSUIntegerMax
instead of specific OR-combined bit masks because it's easier, but if you want to specify which data components to receive, be my guest.
Solution 2
iOS 7 Note: I'm putting this in a few of these questions because use of NSUIntegerMax no longer seems to work on iOS7, and using it caused me to chase my tail for about 3 hours. I just discovered that when I use NSUIntegerMax
, NSDateComponents
ignores set year. So for example this DOES NOT change the year:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
Whereas this DOES:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger timeComps = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit);
NSDateComponents *comps = [gregorian components:timeComps fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
It may be an iOS7 bug or it may be that using NSUIntegerMax working was a fluke which no longer works. I will file a bug report and get a definitive answer.
Regardless, if you want to avoid unexpected consequences specify ALL the components else you might be chasing your tail!
Solution 3
Swift 2.0 version of how you'd set a given date to 8am
extension NSDate {
func setTo8AM() -> NSDate {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
components.hour = 8
return calendar.dateFromComponents(components)!
}
}
Solution 4
Apply this to set the Time from an another date to an existing Date
NSDate *today = [NSDate date]; // from which i need only "Year" "Month" "Date"
NSCalendar *calendar = [NSCalendar currentCalendar]
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit ) fromDate:today];
NSDate *timeDate = datePicker.date; // from which i need only "Hours" "Minutes" and "Seconds"
NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:timeDate];
[dateComponents setHour:[timeComponents hour]];
[dateComponents setMinute:[timeComponents minute]];
[dateComponents setSecond:[timeComponents second]];
NSDate *newDate = [calendar dateFromComponents:dateComponents]; // New Date with My "Year" "Month" "Date" "Hours" "Minutes" and "Seconds"
NSLog(@"New Date: %@",newDate);
Solution 5
Here's a more generic Swift (v2.1.1) extension that builds on Andrew Schreiber's helpful answer.
extension NSDate {
func dateWithTime(hour: Int, minute: Int, second: Int) -> NSDate? {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
components.hour = hour
components.minute = minute
components.second = second
let newDate = calendar.dateFromComponents(components)
return newDate
}
}
Related videos on Youtube
Greg
Updated on July 09, 2022Comments
-
Greg almost 2 years
how do I set an existing
NSDate
's time?That is I have a date (say current date/time), but then want to set this to a specific time (e.g. 11.23am) say. What is the quickest way to do this in objective C?
I'm looking at
NSCalendar
and see methods such asdateByAddingComponents:toDate:options:
, anddateFromComponents:
, but these don't seem to quite hit the mark for what I need here. For example:dateFromComponents:
- I would have to work out all components for this to work which seems like overkilldateByAddingComponents:toDate:options:
- I don't want to ADD in my case but rather "set" the time.
-
Thiha Aung almost 9 yearsAny Help with that? stackoverflow.com/questions/31263690/…
-
iOS Developer about 6 yearsHow can I put this date instead of timer in
scheduletimeinterval
method of objective c. stackoverflow.com/questions/49857236/… -
iOS Developer about 6 yearsHow can I put this date instead of timer in scheduletimeinterval method of objective c. stackoverflow.com/questions/49857236/…
-
iOS Developer about 6 yearsHow can I put this date instead of timer in scheduletimeinterval method of objective c. stackoverflow.com/questions/49857236/…
-
iOS Developer about 6 yearsHow can I put this date instead of timer in scheduletimeinterval method of objective c
-
iOS Developer about 6 yearsHow can I put this date instead of timer in scheduletimeinterval method of objective c stackoverflow.com/questions/49857236/…
-
iOS Developer about 6 yearshow to ut date components instead of a timer in objective c stackoverflow.com/questions/49857236/…