【问题标题】:Check if current date is between two given dates [duplicate]检查当前日期是否在两个给定日期之间[重复]
【发布时间】:2013-05-16 00:07:54
【问题描述】:

我想检查当前日期是否在两个给定日期之间。我执行以下操作

 NSDate *now = [NSDate new];
    NSLog(@"Now is %@",now);
    NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.timeZone = [NSTimeZone localTimeZone];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSLog(@"start dateeee is %@",startDate1);

    NSDateComponents* components2 = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components2 setYear:2013];
    [components2 setMonth:06];
    [components2 setDay:29];
    [components2 setHour:4];
    [components2 setMinute:59];

    NSDate *endDate1 = [myCalendar dateFromComponents:components];
    NSLog(@"end date is %@",endDate1)

;

现在我创建了两个日期Startdate1endDate1。为了检查当前日期是否在我正在执行的日期之间。

NSComparisonResult result1 = [now compare:startDate1];
    NSComparisonResult result2 = [now compare:endDate1];
if (result2 == NSOrderedSame && result1 == NSOrderedSame ) {
        NSLog(@"HELL YEAH! ");
    }

但我从来没有得到一个地狱是的?

注意:我已将我的 iPhone 日期时间设置为开始日期和结束日期之间的时间。这里还有我的日志:

2013-06-29 11:11:48.727 Genk on stage[2205:907] Now is 2013-06-29 09:11:48 +0000
2013-06-29 11:11:48.728 Genk on stage[2205:907] start dateeee is 2013-06-28 03:00:00 +0000
2013-06-29 11:11:48.729 Genk on stage[2205:907] end date is 2013-06-28 03:00:00 +0000

【问题讨论】:

标签: iphone ios objective-c nsdate nsdateformatter


【解决方案1】:

你可以用这个来检查:

- (BOOL)yourDate:(NSDate *)date inRangeFirstDate:(NSDate *)startDate lastDate:(NSDate *)endDate {
   return [date compare:startDate] == NSOrderedDescending &&
          [date compare:endDate]  == NSOrderedAscending;
}

如果它返回 YES,那么 yourDate 位于 startDate 和 endDate 之间,否则它返回 NO

希望对你有帮助

【讨论】:

  • @Downvoter 请说明不赞成这个答案的原因。
【解决方案2】:
NSDate * now;.....
NSDate * endDate1;......

if ([now compare: endDate1] == NSOrderedDescending) {
    NSLog(@"now is later than endDate1");        

} else if ([now compare: endDate1] == NSOrderedAscending) {
    NSLog(@"now is earlier than endDate1");

} else {
    NSLog(@"dates are the same");

}

【讨论】:

    【解决方案3】:

    你的逻辑有问题。返回值NSOrderedSame 表示两个值比较相等。那不是你想要的。相反,您想检查第一个日期是否在当前日期之前,第二个日期是否在其之后:

    if (result1 == NSOrderedAscending && result2 == NSOrderedDescending)
    

    是你应该写的。

    【讨论】:

    • 这行得通。但我认为时区也有问题?我已经设置了小时应该是 5 但我得到 3 ??
    • @StefGeelen NSLog() 对时区一无所知 - 如果您想要正确的输出,您应该使用 NSDateFormatter
    【解决方案4】:

    将您的代码更改为

    if (result2 == NSOrderedDescending && result1 == NSOrderedAscending ) {
            NSLog(@"HELL YEAH! ");
        }
    

    这可能会解决您的问题

    编码愉快:)

    【讨论】:

      【解决方案5】:

      您可以使用以下代码。

      NSTimeInterval fromTime = [startDate1 timeIntervalSinceReferenceDate];
      NSTimeInterval toTime = [endDate1 timeIntervalSinceReferenceDate];
      NSTimeInterval currTime = [[NSDate date] timeIntervalSinceReferenceDate];
      if(currTime>fromTime && currTime<toTime)
      {
            //current time lies between the two dates
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-17
        • 2012-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多