如何确定今天是否有NSDate?

Seu*_*oon 149 cocoa-touch objective-c nsdate nscalendar ios

如何检查一个NSDate属于今天?

我曾经使用前10个字符来检查它[aDate description].[[aDate description] substringToIndex:10]"YYYY-MM-DD"这样返回字符串我将字符串与返回的字符串进行了比较[[[NSDate date] description] substringToIndex:10].

有更快速和/或更好的方式来检查?

谢谢.

Cat*_*Man 302

在macOS 10.9+和iOS 8+中,NSCalendar/Calendar上有一种方法就是这样做的!

- (BOOL)isDateInToday:(NSDate *)date 
Run Code Online (Sandbox Code Playgroud)

所以你就是这么做的

Objective-C的:

BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

let today = Calendar.current.isDateInToday(date)
Run Code Online (Sandbox Code Playgroud)

  • 最短最聪明的解决方案,谢谢:) (5认同)

Dav*_*rek 192

您可以比较日期组件:

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
   [today month] == [otherDay month] &&
   [today year] == [otherDay year] &&
   [today era] == [otherDay era]) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我更喜欢stefan的方法,我认为如果声明更清晰,更容易理解:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];

if([today isEqualToDate:otherDate]) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

克里斯,我已经纳入了你的建议.我不得不查看什么时代,所以对于其他不知道的人来说,它区分了BC和AD.对于大多数人来说这可能是不必要的,但它很容易检查并增加一些确定性,所以我已经包含它了.如果你想要速度,这可能不是一个好方法.


注意与SO上的许多答案一样,7年后这完全过时了.现在只需使用Swift.isDateInToday


Jon*_*Jon 27

这是您的问题的分支,但如果您想要使用"今天"或"昨天"打印NSDate,请使用该功能

- (void)setDoesRelativeDateFormatting:(BOOL)b
Run Code Online (Sandbox Code Playgroud)

对于NSDateFormatter

  • 聪明的主意.但我认为如果你本地化,寻找字符串"今天"会破坏. (3认同)

ste*_*anB 16

我会尝试将今天的日期标准化为午夜和第二个日期,标准化为午夜,然后比较它是否是相同的NSDate.

一个Apple示例中,您将如何规范化到今天午夜的日期,在第二个日期执行相同操作并进行比较:

NSCalendar * gregorian = [[NSCalendar alloc]
                               initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
    [gregorian components:
                 (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
                 fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];
Run Code Online (Sandbox Code Playgroud)


Ben*_*ess 13

工作夫特3&4扩展由Catfish_Man的建议的:

extension Date {

    func isToday() -> Bool {
        return Calendar.current.isDateInToday(self)
    }

}
Run Code Online (Sandbox Code Playgroud)


Vik*_*ica 12

无需兼顾组件,时代和东西.

NSCalendar提供了一种方法来获取现有日期的特定时间单位的开头.

此代码将获取今天和另一个日期的开头并进行比较.如果评估为NSOrderedSame,则两个日期都在同一天 - 所以今天.

NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;

NSDate *now = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:beginningOfOtherDate];

if([today compare:beginningOfOtherDate] == NSOrderedSame) {
    //otherDate is a date in the current day
}
Run Code Online (Sandbox Code Playgroud)


Oma*_*eik 8

extension NSDate {
  func isToday() -> Bool {
    let cal = NSCalendar.currentCalendar()
    var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let today = cal.dateFromComponents(components)!

    components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
    let otherDate = cal.dateFromComponents(components)!

    return today.isEqualToDate(otherDate)
}
Run Code Online (Sandbox Code Playgroud)

在Swift 2.0上为我工作


Voj*_*bka 6

Swift版的最佳答案:

let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!

components = cal.components([.Era, .Year, .Month, .Day], fromDate:aDate);
let otherDate = cal.dateFromComponents(components)!

if(today.isEqualToDate(otherDate)) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)


ale*_*lin 5

您还可以检查您拥有的日期和当前日期之间的时间间隔:

[myDate timeIntervalSinceNow]
Run Code Online (Sandbox Code Playgroud)

这将为您提供myDate与当前日期/时间之间的时间间隔(以秒为单位).

链接.

编辑:请注意每个人:我很清楚[myDate timeIntervalSinceNow]并没有明确地确定myDate是否是今天.

我将这个答案留下来,这样如果有人正在寻找类似的东西并且[myDate timeIntervalSinceNow]很有用,他们可能会在这里找到它.

  • 请记住,这是告诉您是否在24小时内,但如果日期相同则不会.一秒钟的差异可以是不同的日期,而86399秒的差异可以是相同的日期. (3认同)

Art*_*are 5

请参阅Apple的文档条目"执行日历计算" [link].

该页面上的清单13建议,要确定天数之间的中间夜数,请使用:

- (NSInteger)midnightsFromDate:(NSDate *)startDate toDate:(NSDate *)endDate
{
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
    NSInteger startDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                             inUnit:NSEraCalendarUnit
                                            forDate:startDate];
    NSInteger endDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                           inUnit:NSEraCalendarUnit
                                          forDate:endDate];
    return endDay - startDay;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过使用该方法确定两天是否相同,并查看它是否返回0.

  • 请记住,时代在格林威治标准时间00:00开始!如果其中一个日期(或两者)不在GMT时区中,则此方法可能无法正常工作. (2认同)