Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何确定NSDate是否为今天?_Ios_Objective C_Cocoa Touch_Nsdate_Nscalendar - Fatal编程技术网

Ios 如何确定NSDate是否为今天?

Ios 如何确定NSDate是否为今天?,ios,objective-c,cocoa-touch,nsdate,nscalendar,Ios,Objective C,Cocoa Touch,Nsdate,Nscalendar,如何检查NSDate是否属于今天 我曾经用[aDate description]中的前10个字符检查它[[aDate description]substringToIndex:10]返回的字符串类似于“YYYY-MM-DD”,因此我将该字符串与[[NSDate-date]description]substringToIndex:10]返回的字符串进行了比较 是否有更快捷和/或简洁的检查方法 谢谢。您可以比较日期组件: NSDateComponents *otherDay = [[NSCalend

如何检查
NSDate
是否属于今天

我曾经用
[aDate description]
中的前10个字符检查它
[[aDate description]substringToIndex:10]
返回的字符串类似于
“YYYY-MM-DD”
,因此我将该字符串与
[[NSDate-date]description]substringToIndex:10]
返回的字符串进行了比较

是否有更快捷和/或简洁的检查方法


谢谢。

您可以比较日期组件:

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
}
编辑:

我更喜欢stefan的方法,我认为它有助于更清晰、更容易理解的if语句:

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
}
克里斯,我采纳了你的建议。我必须查一下纪元是什么,所以对于其他不知道的人来说,它区分了公元前和公元后。这对大多数人来说可能是不必要的,但它很容易检查并增加了一些确定性,所以我把它包括在内。如果你想提高速度,这可能不是一个好方法



注意与许多答案一样,7年后,这完全过时了。在Swift中,现在只需使用
.isDateInToday
,您还可以检查您拥有的日期与当前日期之间的时间间隔:

[myDate timeIntervalSinceNow]
这将为您提供myDate和当前日期/时间之间的时间间隔(以秒为单位)

编辑:请大家注意:我很清楚,[myDate timeIntervalSinceNow]并不能明确地确定myDate是否在今天


我保留这个答案,这样如果有人在寻找类似的东西,并且[myDate TimeIntervalenceNow]很有用,他们可能会在这里找到它。

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

以下是将今天的日期正常化为午夜的方法,对第二个日期执行相同的操作并进行比较:

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

这可能会被修改为NSDate类别,但我使用了:

// Seconds per day (24h * 60m * 60s)
#define kSecondsPerDay 86400.0f

+ (BOOL) dateIsToday:(NSDate*)dateToCheck
{
    // Split today into components
    NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* comps = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit) 
                                        fromDate:[NSDate date]];

    // Set to this morning 00:00:00
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    NSDate* theMidnightHour = [gregorian dateFromComponents:comps];
    [gregorian release];

    // Get time difference (in seconds) between date and then
    NSTimeInterval diff = [dateToCheck timeIntervalSinceDate:theMidnightHour];
    return ( diff>=0.0f && diff<kSecondsPerDay );
}
//每天的秒数(24小时*60米*60秒)
#定义kSecondsPerDay 86400.0f
+(BOOL)dateIsToday:(NSDate*)dateToCheck
{
//今天分成几个部分
NSCalendar*gregorian=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents*comps=[公历成分:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)
fromDate:[NSDate日期]];
//设置为今天早上00:00:00
[comps设置小时:0];
[comps setMinute:0];
[补偿设置秒:0];
NSDate*theMidnightHour=[GregorianDatefromComponents:comps];
[公历释放];
//获取日期和时间之间的时间差(以秒为单位)
NSTimeInterval diff=[dateToCheck timeIntervalSinceDate:TheMiddNightHour];

return(diff>=0.0f&&diff这是您的问题的一个分支,但是如果您想打印带有“今天”或“昨天”的NSDate,请使用该函数

- (void)setDoesRelativeDateFormatting:(BOOL)b

对于NSDateFormatter

来说,如果您有很多这样的日期比较,那么对
日历:组件:fromDate
的调用开始占用很多时间。根据我所做的一些分析,它们似乎相当昂贵

假设您正在尝试从一些日期数组中确定哪些日期(例如
NSArray*datesToCompare
)与某个给定日期(例如
NSDate*baseDate
)是同一天,那么您可以使用以下内容(部分改编自上面的答案):


我的解决方案是用除法计算自1970年以来经过了多少天,然后比较整数部分

#define kOneDay (60*60*24)
- (BOOL)isToday {
  NSInteger offset = [[NSTimeZone defaultTimeZone] secondsFromGMT];

  NSInteger days =[self timeIntervalSince1970] + offset;
  NSInteger currentDays = [[NSDate date] timeIntervalSince1970] + offset;
  return (days / kOneDay == currentDays / kOneDay);
}

请参阅苹果公司题为“执行日历计算”的文档条目

该页面上的清单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;
}

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

无需处理组件、ERA和其他内容

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

此代码将获取今天的开始日期和另一个日期,并将其进行比较。如果其计算结果为
orsorderedsame
,则这两个日期都在同一天内-因此是今天

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
}

在macOS 10.9+和iOS 8+中,NSCalendar/Calendar上有一个方法可以做到这一点

- (BOOL)isDateInToday:(NSDate *)date 
那你就这么做吧

目标-C:

BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];
let today = Calendar.current.isDateInToday(date)
Swift 3:

BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];
let today = Calendar.current.isDateInToday(date)
对于iOS7及更早版本:

//this is now => need that for the current date
NSDate * now = [NSDate date];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];

NSDateComponents * components = [calendar components:( NSYearCalendarUnit|    NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: now];

[components setMinute:0];
[components setHour:0];
[components setSecond:0];

//this is Today's Midnight
NSDate *todaysMidnight = [calendar dateFromComponents: components];



//now timeIntervals since Midnight => in seconds
NSTimeInterval todayTimeInterval = [now timeIntervalSinceDate: todaysMidnight];

//now timeIntervals since OtherDate => in seconds
NSTimeInterval otherDateTimeInterval = [now timeIntervalSinceDate: otherDate];

if(otherDateTimeInterval > todayTimeInterval) //otherDate is not in today
{
    if((otherDateTimeInterval - todayTimeInterval) <= 86400) //86400 == a day total seconds
    {
        @"yesterday";
    }
    else
    {
        @"earlier";
    }
}
else
{
    @"today";
}


now = nil;
calendar = nil;
components = nil;
todaysMidnight = nil;

NSLog("Thank you :-)");
//这是现在=>当前日期需要它吗
NSDate*现在=[NSDate日期];
NSCalendar*calendar=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
[日历设置时区:[NSTimeZone systemTimeZone]];
NSDateComponents*components=[日历组件:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)fromDate:now];
[组件设置分钟:0];
[组件设置小时:0];
[组件设置秒:0];
//今天是午夜
NSDate*todaysmitnight=[calendar dateFromComponents:components];
//现在,从午夜开始的时间间隔=>以秒为单位
NSTimeInterval todayTimeInterval=[现在的timeIntervalSinceDate:todaysMidnight];
//现在,从OtherDate开始的时间间隔=>以秒为单位
NSTimeInterval otherDateTimeInterval=[now TimeIntervalsIncestate:otherDate];
如果(otherDateTimeInterval>todayTimeInterval)//otherDate不在今天
{

如果((otherDateTimeInterval-todayTimeInterval)检查我们的Erica Sadun的很棒的
NSDate扩展名
。使用非常简单。请在此处修改:


这篇文章已经有了:

最佳答案的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
}

这是我的2美分答案,基于公认的答案,但也支持更新的API。注意:我使用公历,因为大多数时间戳都是GMT,但如果您认为合适,请更改您的时间戳

func isDateToday(date: NSDate) -> Bool {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    if calendar.respondsToSelector("isDateInToday:") {
        return calendar.isDateInToday(date)
    }
    let dateComponents = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
    let today = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: NSDate()))!
    let dateToCompare = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: date))!

    return dateToCompare == today
}

基于最佳答案的Swift扩展:

extension NSDate {
    func isToday() -> Bool {
        let cal = NSCalendar.currentCalendar()
        if cal.respondsToSelector("isDateInToday:") {
            return cal.isDateInToday(self)
        }
        var components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:NSDate())
        let today = cal.dateFromComponents(components)!

        components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:self);
        let otherDate = cal.dateFromComponents(components)!
        return today.isEqualToDate(otherDate)
    }
}

在Swift 2.0上为我工作

正确安全的解决方案,无需强制展开,在Swift 2.2和iOS 8之前工作:

func isToday() -> Bool {
    let calendar = NSCalendar.currentCalendar()
    if #available(iOS 8.0, *) {
        return calendar.isDateInToday(self)
    }

    let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)

    guard let today = calendar.dateFromComponents(todayComponents),
        day = calendar.dateFromComponents(dayComponents) else {
        return false
    }

    return today.compare(day) == .OrderedSame
}
有一个e
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)
}
func isToday() -> Bool {
    let calendar = NSCalendar.currentCalendar()
    if #available(iOS 8.0, *) {
        return calendar.isDateInToday(self)
    }

    let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)

    guard let today = calendar.dateFromComponents(todayComponents),
        day = calendar.dateFromComponents(dayComponents) else {
        return false
    }

    return today.compare(day) == .OrderedSame
}
NSDate *date = ... // The date you wish to test
NSCalendar *calendar = [NSCalendar currentCalendar];

if([calendar isDateInToday:date]) {
    //do stuff
}
extension Date {

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

}