2016-02-23 44 views
0

我试图编写一种实用方法,考虑到当前时间,将返回时间段(早餐,午餐,小吃或晚餐)。查找当前时间在指定时间段

下面是我用来解决这个问题的一步一步的程序。但是,我总是通过我的nextTimeslot方法重新调整NextTimeslotNone。当我打印breakfastBeginingDatebreakfastEndingDate - 都在控制台上打印2016-02-22 18:30:00 +0000

任何想法我在这里做错了什么?

步骤1:定义一个枚举为插槽标识

typedef NS_ENUM(NSInteger, NextTimeslot) { 
    NextTimeslotBreakfast = 0, 
    NextTimeslotLunch, 
    NextTimeslotSnacks, 
    NextTimeslotDinner, 
    NextTimeslotNone 
}; 

步骤2:写设置一些任意日期成分的方法(以忽略日期而比较时隙)

+ (NSDate *)dateByNeutralizingDateComponentsOfDate:(NSDate *)originalDate { 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

    // Get the components for this date 
    NSDateComponents *components = [gregorian components: (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate: originalDate]; 

    // Set the year, month and day to same arbitrary values 
    [components setYear:2000]; 
    [components setMonth:1]; 
    [components setDay:1]; 

    return [gregorian dateFromComponents:components]; 
} 

第3步:在比较一个日期是否在2个指定日期之后,写了一个设置return BOOL的方法

+ (BOOL)isTimeOfDate:(NSDate *)targetDate betweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate { 
    if (!targetDate || !startDate || !endDate) { 
     return NO; 
    } 

    // Make sure all the dates have the same date component. 
    NSDate *newStartDate = [MyUtility dateByNeutralizingDateComponentsOfDate:startDate]; 
    NSDate *newEndDate = [MyUtility dateByNeutralizingDateComponentsOfDate:endDate]; 
    NSDate *newTargetDate = [MyUtility dateByNeutralizingDateComponentsOfDate:targetDate]; 

    // Compare the target with the start and end dates 
    NSComparisonResult compareTargetToStart = [newTargetDate compare:newStartDate]; 
    NSComparisonResult compareTargetToEnd = [newTargetDate compare:newEndDate]; 

    return (compareTargetToStart == NSOrderedDescending && compareTargetToEnd == NSOrderedAscending); 
} 

第4步:写一个方法返回当前时间的正确时间段。

+ (NextTimeslot)nextTimeslot { 
    NSDate *currentDate = [NSDate dateWithTimeIntervalSinceNow:3600]; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm a"]; 

    // Breakfast slot (9:00 AM - 11:00 AM) 
    NSString *breakfastBeginingTime = @"2016-02-23 09:00 am"; 
    NSString *breakfastEndingTime = @"2016-02-23 11:00 am"; 
    NSDate *breakfastBeginingDate = [formatter dateFromString:breakfastBeginingTime]; 
    NSDate *breakfastEndingDate = [formatter dateFromString:breakfastEndingTime]; 

    if ([MyUtility isTimeOfDate:currentDate betweenStartDate:breakfastBeginingDate andEndDate:breakfastEndingDate]) { 
     return NextTimeslotBreakfast; 
    } 

    // Lunch slot (11:30 AM - 2:00 PM) 
    NSString *lunchBeginingTime = @"2016-02-23 11:30 am"; 
    NSString *lunchEndingTime = @"2016-02-23 02:00 pm"; 
    NSDate *lunchBeginingDate = [formatter dateFromString:lunchBeginingTime]; 
    NSDate *lunchEndingDate = [formatter dateFromString:lunchEndingTime]; 

    if ([MyUtility isTimeOfDate:currentDate betweenStartDate:lunchBeginingDate andEndDate:lunchEndingDate]) { 
     return NextTimeslotLunch; 
    } 

    // Snacks slot (3:30 PM - 6:30 PM) 
    NSString *snacksBeginingTime = @"2016-02-23 03:30 pm"; 
    NSString *snacksEndingTime = @"2016-02-23 06:30 pm"; 
    NSDate *snacksBeginingDate = [formatter dateFromString:snacksBeginingTime]; 
    NSDate *snacksEndingDate = [formatter dateFromString:snacksEndingTime]; 

    if ([MyUtility isTimeOfDate:currentDate betweenStartDate:snacksBeginingDate andEndDate:snacksEndingDate]) { 
     return NextTimeslotSnacks; 
    } 

    // Dinner slot (07:30 PM - 10:00 PM) 
    NSString *dinnerBeginingTime = @"2016-02-23 07:30 pm"; 
    NSString *dinnerEndingTime = @"2016-02-23 10:00 pm"; 
    NSDate *dinnerBeginingDate = [formatter dateFromString:dinnerBeginingTime]; 
    NSDate *dinnerEndingDate = [formatter dateFromString:dinnerEndingTime]; 

    if ([MyUtility isTimeOfDate:currentDate betweenStartDate:dinnerBeginingDate andEndDate:dinnerEndingDate]) { 
     return NextTimeslotDinner; 
    } 

    return NextTimeslotNone; 
} 

回答

0

好的,通过加入另一种方法来UTC转换成当前系统时间区固定它。这工作得很好。分享它,希望为别人节省宝贵的时间。

+ (NSDate *)systemDateForDate:(NSDate *)iDate { 
    NSTimeZone *tz = [NSTimeZone defaultTimeZone]; 
    NSInteger seconds = [tz secondsFromGMTForDate:iDate]; 
    return [NSDate dateWithTimeInterval: seconds sinceDate:iDate]; 
} 

并在我的时隙计算中使用此方法。

+ (NextTimeslot)nextTimeslot { 
    NSDate *currentDate = [MyFCUtility systemDateForDate:[NSDate date]]; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeZone:[NSTimeZone systemTimeZone]]; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

    // Breakfast slot (9:00 AM - 11:00 AM) 
    NSString *breakfastBeginingTime = @"2016-02-23 09:00:00"; 
    NSString *breakfastEndingTime = @"2016-02-23 11:00:00"; 
    NSDate *breakfastBeginingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:breakfastBeginingTime]]; 
    NSDate *breakfastEndingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:breakfastEndingTime]]; 

    if ([MyFCUtility isTimeOfDate:currentDate betweenStartDate:breakfastBeginingDate andEndDate:breakfastEndingDate]) { 
     return NextTimeslotBreakfast; 
    } 

    // Lunch slot (11:30 AM - 2:00 PM) 
    NSString *lunchBeginingTime = @"2016-02-23 11:30:00"; 
    NSString *lunchEndingTime = @"2016-02-23 15:00:00"; 
    NSDate *lunchBeginingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:lunchBeginingTime]]; 
    NSDate *lunchEndingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:lunchEndingTime]]; 


    if ([MyFCUtility isTimeOfDate:currentDate betweenStartDate:lunchBeginingDate andEndDate:lunchEndingDate]) { 
     return NextTimeslotLunch; 
    } 

    // Snacks slot (3:30 PM - 6:30 PM) 
    NSString *snacksBeginingTime = @"2016-02-23 15:30:00"; 
    NSString *snacksEndingTime = @"2016-02-23 18:30:00"; 
    NSDate *snacksBeginingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:snacksBeginingTime]]; 
    NSDate *snacksEndingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:snacksEndingTime]]; 

    if ([MyFCUtility isTimeOfDate:currentDate betweenStartDate:snacksBeginingDate andEndDate:snacksEndingDate]) { 
     return NextTimeslotSnacks; 
    } 

    // Dinner slot (07:30 PM - 10:00 PM) 
    NSString *dinnerBeginingTime = @"2016-02-23 19:30:00"; 
    NSString *dinnerEndingTime = @"2016-02-23 22:00:00"; 
    NSDate *dinnerBeginingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:dinnerBeginingTime]]; 
    NSDate *dinnerEndingDate = [MyFCUtility systemDateForDate:[formatter dateFromString:dinnerEndingTime]]; 

    if ([MyFCUtility isTimeOfDate:currentDate betweenStartDate:dinnerBeginingDate andEndDate:dinnerEndingDate]) { 
     return NextTimeslotDinner; 
    } 

    return NextTimeslotNone; 
}