【问题标题】:Comparing two dates in Objective-C [duplicate]比较Objective-C中的两个日期[重复]
【发布时间】:2013-06-22 14:37:25
【问题描述】:

我需要将当前日期/时间与用户选择的日期/时间进行比较。 下面是我的代码sn-p

-(IBAction)btnSaveTouched:(id)sender {
NSDate *today = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd H:mm"];
NSString *formatterDate = [formatter stringFromDate: today];

NSComparisonResult comparisionResult1 = [self.paramSchedule1StartSQLDateString compare:formatterDate];

if (comparisionResult1 == NSOrderedAscending) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Viewing schedule must be after current time." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    return;
} 

NSLog(@"comparisionResult1 %d", comparisionResult1);

}

点击 btnSaveTouched(UIButton) 后,日期/时间将存储到数据库中并返回屏幕。 (用户选择日期/时间的视图控制器)

但是,当我尝试比较另一个日期/时间时,即使我选择的日期/时间晚于当前日期/时间,也会显示警报。

NSLog 后comparsionResult1 后,第二次检查总是值为1。 我试图这样做 NSComparsionResult comparisionResult1 = 0;但它不能正常工作。有什么办法可以做到这一点?

请指教。 谢谢

【问题讨论】:

  • 添加显示两个日期字符串的日志语句。这样您就可以准确地看到正在比较的内容。顺便说一句 - 如果您比较两个 NSDate 对象而不是两个日期字符串,那会更好。
  • 如果您坚持使用日期字符串,则使用 2 位数的小时会有所帮助。使用HH 而不是H
  • 嗨,我 NSLog 两个日期是 2013-06-26 1:23(当前日期)和 2013-06-28 9:25(用户选择的日期)。按道理它不应该进入 if 语句。
  • 您可以通过多种方式比较日期。显然,如果您比较字符串,则必须确保字符串中的字段按重要性顺序排列。此外,您需要确保它们的宽度相同,以便在“9:00”之后比较“​​10:00”(通过将“9:00”扩展为“09:00”)。如果您不小心,使用格式化的日期可能会被locale "feature" 咬住。但是比较 NSDate 对象也有一些缺陷。
  • 嗨,比较两个日期的最佳方法是什么?希望确保用户不会选择早于当前日期/时间的日期/时间。

标签: objective-c nsdate


【解决方案1】:

日期之间的比较你需要小心,特别是如果你与 NSString 比较,你必须确保两个日期都安排好了,你需要小心两种格式。所以我建议你比较两个 NSDate。 示例:

NSDate *date1 = //…
NSDate *date2 = //…
switch ([date1 compare:date2]) {
    case NSOrderedAscending:
    //Do your logic when date1 > date2
        break;

    case NSOrderedDescending:
    //Do your logic when date1 < date2
        break;

    case NSOrderedSame:
    //Do your logic when date1 = date2
        break;
}

当然,您可以为 NSDate 实现一个类别。但已经存在,我喜欢使用这个:NSDate Category,你可以随意编辑和自定义。

【讨论】:

  • 这将如何运作?
  • @vikingosegundo 已更新,忘记比较了^^
  • 感谢@vikingosegundo :)
  • 在目标 C 中比较 Date 对象的最佳方法!
  • 我认为你的结果是相反的
【解决方案2】:

尝试使用此代码进行日期之间的任何比较...您不应该以字符串的形式比较日期。比较转换为字符串之前的日期。使用格式化程序的dateFromString 函数将self.paramSchedule1StartSQLDateString 转换为日期格式,方法是将确切的日期格式指定为dateString 的格式。然后使用以下函数比较日期。

NSDate *today = [NSDate date]; // current date
NSDate *newDate = self.paramSchedule1StartSQLDateString; // other date 

NSComparisonResult result; 

result = [today compare:newDate]; // comparing two dates

if(result == NSOrderedAscending)
    NSLog(@"today is less");
else if(result == NSOrderedDescending)
    NSLog(@"newDate is less");
else if(result == NSOrderedSame)
    NSLog(@"Both dates are same");
else
    NSLog(@"Date cannot be compared");

【讨论】:

  • 我想检查我的到期日期是否已经过去?还是会来?
【解决方案3】:
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
                [dateFormatter setDateFormat:@"yyyy-MM-dd"];
                NSDate *date1 = [dateFormatter dateFromString:TodayDate];

                NSDateFormatter *dateFormatte = [[[NSDateFormatter alloc] init] autorelease];
                [dateFormatte setDateFormat:@"yyyy-MM-dd"];
                NSDate *date2 = [dateFormatte dateFromString:CompareDate];

                unsigned int unitFlags = NSDayCalendarUnit;

                NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
                NSDateComponents *comps = [gregorian components:unitFlags fromDate:date1  toDate:date2  options:0];

                int days = [comps day];
                NSLog(@"%d",days);

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2010-11-02
    • 2011-08-09
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多