Create NSDate with a specific time

Try out NSDateComponents.

    // Initialize date components with date values
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setYear:2014];
    [dateComponents setMonth:1];
    [dateComponents setDay:28];
    [dateComponents setHour:11];
    [dateComponents setMinute:9];

    NSCalendar *calendar = [[NSCalendar alloc]  initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *configuredDate = [calendar dateFromComponents:dateComponents];

I'm not sure what the various NSCalendar identifier configuration options the initWithCalendarIndetifier will take, but if this answer is helpful maybe someone can add an edit with some additional info.


Your concern seems to be about edge cases, this suggests to me that rather than "6pm today" you are actually looking for the "next 6pm", i.e. if the time is past 6pm you want 6pm tomorrow?

Maybe the following will help, whether my guess is correct or not:

  1. Get the current date & time - NSDate
  2. Get the current calendar - NSCalendar
  3. Set the time zone of the calendar to your desired time zone
  4. Using the calendar convert the date to components - NSDateComponents - only extracting the components for year, month, day, hour & time zone. You now have the current time components in the target time zone rounded down to the nearest hour.
  5. Create an NSDate from your extracted time components using your calendar. You now have your rounded down time as an NSDate.
  6. Using your components calculate the number of hours to add to advance the time to the next 6pm.
  7. Convert the number of hours to seconds to produce an NSTimeInterval value, add that interval to your rounded down date. NSDate will take care of the edge cases of advancing the date, changing the month, etc. as needed.

HTH


Swift

let calendar = Calendar(identifier: .gregorian)
let units: Set<Calendar.Component> = [.year, .month, .day, .hour]
var components = calendar.dateComponents(units, from: Date())
components.hour = 18
let todayAt6PM = calendar.date(from: components)

Objective C

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSCalendarUnit calendarUnits = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour;
NSDateComponents *components = [calendar components:calendarUnits fromDate:[NSDate date]];
[components setHour:18];
NSDate *todayAt6PM = [calendar dateFromComponents:components];