0
我试图编写一种实用方法,考虑到当前时间,将返回时间段(早餐,午餐,小吃或晚餐)。查找当前时间在指定时间段
下面是我用来解决这个问题的一步一步的程序。但是,我总是通过我的nextTimeslot
方法重新调整NextTimeslotNone
。当我打印breakfastBeginingDate
和breakfastEndingDate
- 都在控制台上打印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;
}