Iphone 检查时间和日期是否在特定日期和时间之间
我有3个变量 开始日期-4月12日星期三 结束日期-6月11日星期三 持续时间-Iphone 检查时间和日期是否在特定日期和时间之间,iphone,objective-c,ios,nsdate,nsdateformatter,Iphone,Objective C,Ios,Nsdate,Nsdateformatter,我有3个变量 开始日期-4月12日星期三 结束日期-6月11日星期三 持续时间-11.00 am从11.00 pm开始。(这是一个字符串,上午11点是开始时间,下午12点是结束时间) 1.)现在,我需要获取当前日期和时间([NSDate date]),检查当前日期是否在开始日期和结束日期之间,然后检查当前时间是否在持续时间之间(从晚上11:00开始的上午11:00之间) 2.)如果当前时间介于持续时间之间(从上午11点到下午11点之间),我需要计算以下场景的剩余时间 a、 )如果时间是上午10点
11.00 am从11.00 pm开始
。(这是一个字符串,上午11点是开始时间,下午12点是结束时间)
1.)现在,我需要获取当前日期和时间([NSDate date]
),检查当前日期是否在开始日期
和结束日期
之间,然后检查当前时间是否在持续时间
之间(从晚上11:00开始的上午11:00之间)
2.)如果当前时间介于持续时间之间(从上午11点到下午11点之间),我需要计算以下场景的剩余时间
a、 )如果时间是上午10点,我需要计算到开始时间的时间,即11.00am
。(答案是1小时
)
b、 )如果时间是11.45AM
,由于时间大于开始时间(即11.00am
),我需要计算到结束时间(即11.00pm
)的剩余时间
c、 )如果时间是11.45pm
,由于时间大于结束时间(即11.00pm
),我需要打印一个NSLog,说明“时间已超过”。您可以使用-(NSComparisonResult)比较:(NSDate*)另一个日期
将当前日期与startDate和endDate进行比较
NSComparisonResult
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
例如:
NSDate *currentDate = [NSDate date];
if (([currentDate compare:startDate ] == NSOrderedDescending) &&
([currentDate compare:endDate ] == NSOrderedAscending)) {
//currentDate is between startDate and endDate.
}
或者查看解决方案。基本思想是将开始日期
和结束日期
转换为实际的NSDate
,并与当前日期进行比较。然后,如果当前日期在适当的范围内,则将开始时间和结束时间添加到当前日期上,以获得开始时间和结束时间的特定时间点。获得这些日期后,可以使用NSDate的compare
和timeintervalncedate
方法获取所需的值:
// NOTE: NO error checking is being done in this code.
// Starting variables
NSString *startDateString = @"Wed Apr 12";
NSString *endDateString = @"Wed Jun 11";
NSString *timeDurationString = @"11.00 am from 11.00 pm";
// Get the current date
NSDate *currentTime = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents
*currentDateComps = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
fromDate:currentTime];
// Add the current year onto our date string
NSString *startDateStringWithYear = [NSString stringWithFormat:@"%@ %d", startDateString, currentDateComps.year];
NSString *endDateStringWithYear = [NSString stringWithFormat:@"%@ %d", endDateString, currentDateComps.year];
// Calculate NSDate's for start/endDate
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEE MM dd yyyy"];
NSDate *startDate = [formatter dateFromString:startDateStringWithYear];
NSDate *endDate = [formatter dateFromString:endDateStringWithYear];
// Return if today's date is not between the start and end dates
if ([startDate compare:currentTime] == NSOrderedDescending ||
[endDate compare:currentTime] == NSOrderedAscending)
{
return;
}
// Break the timeDurationString into separate words
NSArray *timeDurationStringWords = [timeDurationString componentsSeparatedByString:@" "];
// Calculate NSDate's for the start time for today:
NSString *startTimeString = [timeDurationStringWords objectAtIndex:0];
currentDateComps.hour = [[startTimeString substringToIndex:2] intValue];
currentDateComps.minute = [[startTimeString substringFromIndex:3] intValue];
if ([[timeDurationStringWords objectAtIndex:1] isEqualToString:@"pm"])
{
currentDateComps.hour += 12;
}
NSDate *startTime = [cal dateFromComponents:currentDateComps];
// And now the end time for today
NSString *endTimeString = [timeDurationStringWords objectAtIndex:3];
currentDateComps.hour = [[endTimeString substringToIndex:2] intValue];
currentDateComps.minute = [[endTimeString substringFromIndex:3] intValue];
if ([[timeDurationStringWords objectAtIndex:4] isEqualToString:@"pm"])
{
currentDateComps.hour += 12;
}
NSDate *endTime = [cal dateFromComponents:currentDateComps];
// Now we have what we really want: A specific start time, current time, and end time.
// Check to see if we are waiting to start:
if ([startTime compare:currentTime] == NSOrderedDescending) {
NSTimeInterval minutesToStartTime = [startTime timeIntervalSinceDate:currentTime] / 60;
NSLog(@"Start time is in %02d+%02d", (int)(minutesToStartTime / 60), (int)minutesToStartTime % 60);
return;
}
// Check to see if we are late:
if ([endTime compare:currentTime] == NSOrderedAscending) {
NSLog(@"Time Exceeded");
return;
}
// We are between the two times:
NSTimeInterval minutesToEndTime = [endTime timeIntervalSinceDate:currentTime] / 60;
NSLog(@"End time is in %02d+%02d", (int)(minutesToEndTime / 60), (int)minutesToEndTime % 60);
如果当前时间为12:15 AM,则可能会重复?从昨天算起是太迟了,还是今天太早了?startDate是什么类型的变量?NSDate或NSString?但是,如果currentTime
等于startDateString
或endDateString
,它将执行if([startDate compare:currentTime]==传感器降级…
块,不计算剩余时间。如何解决此问题?将==传感器降级
更改为!=传感器降级
(这基本上意味着我需要当前时间来获得系统日期和时间(现在它显示GMT时间),startTime和endTime也一样。我需要显示endDateString或startDateString剩余时间的秒数。它是当前时间(除非您在调试器中检查它,它只是以GMT显示)。我以分钟为单位计算了剩余时间。只需去掉“除以60”即可你还有几秒钟。。。。