2016-02-23 48 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; 
}