比较两个NSDates的最有效/推荐的方法是什么?我希望能够看到两个日期是否在同一天,无论时间如何,并且已经开始编写一些在NSDate类中使用timeIntervalSinceDate:方法的代码,并获取此值的整数除以秒数一天内 . 这似乎很长,我觉得我错过了一些明显的东西 .
我试图解决的代码是:
if (!([key compare:todaysDate] == NSOrderedDescending))
{
todaysDateSection = [eventSectionsArray count] - 1;
}
其中key和todaysDate是NSDate对象,todaysDate使用以下方法创建:
NSDate *todaysDate = [[NSDate alloc] init];
问候
戴夫
16 回答
在进行比较之前,您将日期中的时间设置为00:00:00:
然后,您可以比较日期值 . 见overview in reference documentation .
我很惊讶没有其他答案有这个选项来获取对象的“开始日期”日期:
将
date1
和date2
设置为各自日期的开头 . 如果他们是平等的,他们就在同一天 .或者这个选项:
将
day1
和day2
设置为可以比较的某些任意值 . 如果他们是平等的,他们就在同一天 .有一个新的方法被引入到NSCalendar与iOS 8,使这更容易 .
您将粒度设置为重要的单位 . 这忽略了所有其他单位并限制与所选单位的比较 .
对于iOS8及更高版本,检查同一天是否出现两个日期非常简单:
见documentation
这是所有答案的简写:
我使用了Duncan C方法,我修正了他犯的一些错误
我用这个小的util方法:
(你显然需要一个名为
calendar_
的ivar,其中包含NSCalendar
. )使用这个,很容易检查今天的日期是这样的:
(
[NSDate date]
返回当前日期和时间 . )这当然与格雷戈里的建议非常相似 . 这种方法的缺点是它往往会创建大量临时的
NSDate
对象 . 如果你要处理很多日期,我建议使用其他方法,例如直接比较组件,或使用NSDateComponents
对象而不是NSDates
.答案比每个人都做到的更简单 . NSCalendar有一个方法
该方法允许您使用您想要的任何单位计算两个日期之间的差异 .
所以写一个像这样的方法:
如果上述方法返回零,则两个日期在同一天 .
从iOS 8.0开始,您可以使用:
如果结果是例如NSOrderedDescending,otherDate在[NSDate date]之前以天为单位 .
我在NSCalendar文档中没有看到这个方法,但它在iOS 7.1 to iOS 8.0 API Differences中
对于在Swift 3中编码的开发人员
我的解决方案是使用NSDateFormatter进行两次转换:
使用Swift 3,根据您的需要,您可以选择以下两种模式之一来解决您的问题 .
#1 . 使用compare(_:to:toGranularity :)方法
Calendar
有一个名为compare(_:to:toGranularity:)的方法 .compare(_:to:toGranularity:)
有以下声明:下面的Playground代码显示热使用它:
#2 . 使用dateComponents(_:from:to :)
Calendar
有一个名为dateComponents(_:from:to:)的方法 .dateComponents(_:from:to:)
有以下声明:下面的Playground代码显示热使用它:
有关NSDate的文档表明
compare:
和isEqual:
方法都将执行基本比较并对结果进行排序,尽管它们仍然是时间因素 .管理任务的最简单方法可能是创建一个新的
isToday
方法,以实现以下效果:这对皮肤来说是一种特别难看的猫,但这是另一种方法 . 我不是说它很优雅,但它可能与iOS中的日期/时间支持一样接近 .
比较小时以及修复1天的差异