如何检查两个NSDates是否来自同一天

Jos*_*osh 45 nsdate ios swift

我正在进行ios开发,我发现很难检查两个NSDates是否来自同一天.我试着用这个

   fetchDateList()
    // Check date
    let date = NSDate()
    // setup date formatter
    let dateFormatter = NSDateFormatter()
    // set current time zone
    dateFormatter.locale = NSLocale.currentLocale()

    let latestDate = dataList[dataList.count-1].valueForKey("representDate") as! NSDate
    //let newDate = dateFormatter.stringFromDate(date)
    let diffDateComponent = NSCalendar.currentCalendar().components([NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day], fromDate: latestDate, toDate: date, options: NSCalendarOptions.init(rawValue: 0))
    print(diffDateComponent.day)
Run Code Online (Sandbox Code Playgroud)

但它只是检查两个NSDates是否有24小时的差异.我认为有一种方法可以使它工作但是,我希望在早上凌晨2点之前将NSDate值计算为前一天,所以我在这里肯定需要一些帮助.谢谢!

Cat*_*Man 136

NSCalendar有一个方法可以完全满足您的需求!

/*
    This API compares the Days of the given dates, reporting them equal if they are in the same Day.
*/
- (BOOL)isDate:(NSDate *)date1 inSameDayAsDate:(NSDate *)date2 NS_AVAILABLE(10_9, 8_0);
Run Code Online (Sandbox Code Playgroud)

所以你要像这样使用它:

[[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2];
Run Code Online (Sandbox Code Playgroud)

或者在斯威夫特

Calendar.current.isDate(date1, inSameDayAs:date2)
Run Code Online (Sandbox Code Playgroud)

  • 它似乎不适用于诸如“2017-06-12T00:00:00.000Z”和“2017-06-12T23:59:59.999Z”之类的特定日期 --> “23:59:59”由于某种原因(我的时区是 +2,21:59:59 工作正常)。似乎对时区做了一些事情,但我还没有想出如何让它工作。 (2认同)

Mik*_*son 9

您应该比较日期组件:

let date1 = NSDate(timeIntervalSinceNow: 0)
let date2 = NSDate(timeIntervalSinceNow: 3600)

let components1 = NSCalendar.currentCalendar().components([.Year, .Month, .Day], fromDate: date1)
let components2 = NSCalendar.currentCalendar().components([.Year, .Month, .Day], fromDate: date2)

if components1.year == components2.year && components1.month == components2.month && components1.day == components2.day {
    print("same date")
} else {
    print("different date")
}
Run Code Online (Sandbox Code Playgroud)

或更短:

let diff = Calendar.current.dateComponents([.day], from: self, to: date)
if diff.day == 0 {
    print("same day")
} else {
    print("different day")
}
Run Code Online (Sandbox Code Playgroud)

  • 如果是不同的时区,请将`components`替换为`componentsInTimeZone(_,fromDate:_)` (3认同)