Objective c iOS:比较两个无时间部分的NSDate-s
我想比较两个日期:日期1和日期2Objective c iOS:比较两个无时间部分的NSDate-s,objective-c,ios,cocoa-touch,nsdate,Objective C,Ios,Cocoa Touch,Nsdate,我想比较两个日期:日期1和日期2 2011-06-06 12:59:48.994 Project[419:707] firstDate:2011-06-06 10:59:21 +0000 2011-06-06 12:59:49.004 Project[419:707] selectedData:2011-06-06 10:59:17 +0000 但这些日期有不同的时间,当我使用OrderedName时,它不能正常工作,我如何解决 我的代码: NSDate *firstDate = [[appD
2011-06-06 12:59:48.994 Project[419:707] firstDate:2011-06-06 10:59:21 +0000
2011-06-06 12:59:49.004 Project[419:707] selectedData:2011-06-06 10:59:17 +0000
但这些日期有不同的时间,当我使用OrderedName时,它不能正常工作,我如何解决
我的代码:
NSDate *firstDate = [[appDelegate.project objectAtIndex:i]objectAtIndex:3];
NSDate *secondDate = [[appDelegate.project objectAtIndex:i]objectAtIndex:4];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);
NSDateComponents *date1Components = [calendar components:comps
fromDate:firstDate];
NSDateComponents *date2Components = [calendar components:comps
fromDate:secondDate];
NSDateComponents *date3Components = [calendar components:comps fromDate:appDelegate.selectedDate];
NSLog(@"firstDate:%@", [date1Components date]);
NSLog(@"secondDate:%@", [date2Components date]);
NSLog(@"selectedData:%@", [date3Components date]);
NSComparisonResult compareStart = [[date1Components date] compare: [date3Components date]];
NSComparisonResult compareEnd = [[date2Components date] compare: [date3Components date]];
if ((compareStart == NSOrderedAscending || compareStart == NSOrderedSame)
&& (compareEnd == NSOrderedDescending || compareEnd == NSOrderedSame))
{
NSLog(@"inside");
然后我想在date1时比较我的日期和“if”中的条目
还有另一种简便的方法可以为给定的日期创建表示给定单元开始的日期:
要说明此方法的工作原理,请参阅以下代码,它可以轻松地为给定日期(此处:现在)创建一天、一周、一个月和一年的开始日期 结果:
Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time
Thursday, July 12, 2012, 12:00:00 AM Central European Summer Time
Sunday, July 8, 2012, 12:00:00 AM Central European Summer Time
Sunday, July 1, 2012, 12:00:00 AM Central European Summer Time
Sunday, January 1, 2012, 12:00:00 AM Central European Standard Time
这允许我们将第一个代码缩短为:
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date1 interval:NULL forDate:date1];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date2 interval:NULL forDate:date2];
NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
} else if (result == NSOrderedDescending) {
} else {
//the same
}
注意,在此代码中,
date1
和date2
将被覆盖。或者,您可以将对另一个NSDate指针的引用传递给startDate
,如上面的代码所示,其中现在保持不变。我使用了另一种方法与NSDateFormatter和字符串比较,不如
NSDate比较方法,但编写速度更快,灵活性足以进行各种比较:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd"];
if ([[dateFormat stringFromDate:date1] isEqualToString:[dateFormat stringFromDate:date2]])
{
//It's the same day
}
Swift版本,比较日期并忽略其时间
let dateExam1:NSDate = NSDate.init(timeIntervalSinceNow: 300)
let dateExam2:NSDate = NSDate.init(timeIntervalSinceNow: 10000)
let currCalendar = NSCalendar.currentCalendar()
let dateCompanent1:NSDateComponents = currCalendar.components([.Year,.Month,.Day], fromDate: dateExam1)
let dateCompanent2:NSDateComponents = currCalendar.components([.Year,.Month,.Day], fromDate: dateExam2)
let date1WithoutTime:NSDate? = currCalendar .dateFromComponents(dateCompanent1)
let date2WithoutTime:NSDate? = currCalendar .dateFromComponents(dateCompanent2)
if (date1WithoutTime != nil) && (date2WithoutTime != nil)
{
let dateCompResult:NSComparisonResult = date1WithoutTime!.compare(date2WithoutTime!)
if (dateCompResult == NSComparisonResult.OrderedSame)
{
print("Same Dates")
}
else
{
print("Different Dates")
}
}
好的,在最初的问题被问到几年后,但可能值得一提的是,现在有很多方法可以让某些日期比较问题更直接:
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
Bool sameDay = [currentCalendar isDate:dateA inSameDayAsDate:dateB];
更新@LuAndre应答swift 5
let dateExam1 = Date(timeIntervalSinceNow: 300)
let dateExam2 = Date(timeIntervalSinceNow: 10000)
let currCalendar = Calendar.current
let dateCompanent1 = currCalendar.dateComponents([.year,.month,.day], from: dateExam1)
let dateCompanent2 = currCalendar.dateComponents([.year,.month,.day], from: dateExam2)
if let date1WithoutTime = currCalendar.date(from:dateCompanent1), let dateCompanent2 = currCalendar.date(from:dateCompanent2) {
let dateCompResult = date1WithoutTime.compare(dateCompanent2)
if (dateCompResult == ComparisonResult.orderedSame)
{
print("Same Dates")
}
else
{
print("Different Dates")
}
}
我有一个警告:“NSDateComponents可能不响应比较”第一个实现是否覆盖了date1和date2,似乎会将小时、分钟和秒设置为0,因为:date1=[calendar dateFromComponents:date1Components];date2=[calendar dateFromComponents:date2 Components]@McGar是的,它为变量分配了新的对象。至少在2016年,NSCalendar
有很多有用的日期比较方法。2020年对我来说仍然有用。我发现[[NSCalendar currentCalendar]rangeOfUnit:NSDayCalendarUnit startDate:&StartTofToToToToDay间隔:NULL forDate:now]代码>在我的应用程序中很有用。而不是NSLog(@“firstDate:%@,[date1Components date])
tryNSLog(@“firstDate:%@,[calendar dateFromComponents:Date1 Components])代码>有什么变化吗?现在是2011-06-05 22:00:00+0000为什么?????可能是某个时区/DST魔法工作正常:我写[date1Components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:(+0*3600)];和NSComparisonResult compareStart=[[calendar dateFromComponents:date1Components]比较:[calendar dateFromComponents:date3Components]];谢谢
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
Bool sameDay = [currentCalendar isDate:dateA inSameDayAsDate:dateB];
let dateExam1 = Date(timeIntervalSinceNow: 300)
let dateExam2 = Date(timeIntervalSinceNow: 10000)
let currCalendar = Calendar.current
let dateCompanent1 = currCalendar.dateComponents([.year,.month,.day], from: dateExam1)
let dateCompanent2 = currCalendar.dateComponents([.year,.month,.day], from: dateExam2)
if let date1WithoutTime = currCalendar.date(from:dateCompanent1), let dateCompanent2 = currCalendar.date(from:dateCompanent2) {
let dateCompResult = date1WithoutTime.compare(dateCompanent2)
if (dateCompResult == ComparisonResult.orderedSame)
{
print("Same Dates")
}
else
{
print("Different Dates")
}
}