比较没有时间组件的NSDates

agf*_*105 54 time nsdate foundation ios swift

在一个快速的操场上,我一直在使用

NSDate.date() 
Run Code Online (Sandbox Code Playgroud)

但是,这总是会附加时间元素.对于我的应用程序,我需要忽略时间元素.这在Swift中可能吗?怎么做到呢?即使我可以将时间元素设置为每个日期也同时工作.

此外,我正在尝试比较两个日期,目前我正在使用以下代码:

var earlierDate:NSDate = firstDate.earlierDate(secondDate)
Run Code Online (Sandbox Code Playgroud)

这是唯一的方法,还是可以忽略时间元素的方式?例如,如果他们是同一天,但不同的时间,我不想要结果.

Ash*_*lls 113

使用此Calendar功能可以比较iOS 8.0+中的日期

func compare(_ date1: Date, to date2: Date, toGranularity component: Calendar.Component) -> ComparisonResult
Run Code Online (Sandbox Code Playgroud)


.day作为单位 传球

使用此功能如下:

let now = Date()
// "Sep 23, 2015, 10:26 AM"
let olderDate = Date(timeIntervalSinceNow: -10000)
// "Sep 23, 2015, 7:40 AM"

var order = Calendar.current.compare(now, to: olderDate, toGranularity: .hour)

switch order {
case .orderedDescending:
    print("DESCENDING")
case .orderedAscending:
    print("ASCENDING")
case .orderedSame:
    print("SAME")
}

// Compare to hour: DESCENDING

var order = Calendar.current.compare(now, to: olderDate, toGranularity: .day)


switch order {
case .orderedDescending:
    print("DESCENDING")
case .orderedAscending:
    print("ASCENDING")
case .orderedSame:
    print("SAME")
}

// Compare to day: SAME
Run Code Online (Sandbox Code Playgroud)

  • 这是新的iOS 8.0`NSCalendar` API之一.请参阅*iOS 7.1到iOS 8.0 API中的`NSCalendar.h`差异* (2认同)
  • 我认为这两条评论,表明预期结果是错误的.`//比较日:DESCENDING`应该是'SAME`,反之亦然. (2认同)

sla*_*mor 16

iOS 8.0+中的NSCalendar中有几种有用的方法:

startOfDayForDate, isDateInToday, isDateInYesterday, isDateInTomorrow
Run Code Online (Sandbox Code Playgroud)

甚至比较日子:

func isDate(date1: NSDate!, inSameDayAsDate date2: NSDate!) -> Bool
Run Code Online (Sandbox Code Playgroud)

要忽略time元素,可以使用:

var toDay = Calendar.current.startOfDay(for: Date())
Run Code Online (Sandbox Code Playgroud)

但是,如果你还必须支持iOS 7,你总是可以写一个扩展名

extension NSCalendar {
    func myStartOfDayForDate(date: NSDate!) -> NSDate!
    {
        let systemVersion:NSString = UIDevice.currentDevice().systemVersion
        if systemVersion.floatValue >= 8.0 {
            return self.startOfDayForDate(date)
        } else {
            return self.dateFromComponents(self.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Sar*_*ith 13

Xcode 11.2.1,Swift 5 及以上

检查日期是否具有同一天组件。

Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)
Run Code Online (Sandbox Code Playgroud)

根据需要调整到粒度。


小智 8

我写了以下方法,通过借用Ashley Mills解决方案来比较两个日期.它比较两个日期,如果两个日期相同,则返回true(剥离时间).

func compareDate(date1:NSDate, date2:NSDate) -> Bool {
    let order = NSCalendar.currentCalendar().compareDate(date1, toDate: date2,
        toUnitGranularity: .Day)
    switch order {
    case .OrderedSame:
        return true
    default:
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

它被称为这样:

if compareDate(today, date2: anotherDate) {
    // The two dates are on the same day.
}
Run Code Online (Sandbox Code Playgroud)


zs2*_*020 8

在Swift 4中:

func compareDate(date1:Date, date2:Date) -> Bool {
    let order = NSCalendar.current.compare(date1, to: date2, toGranularity: .day)
    switch order {
    case .orderedSame:
        return true
    default:
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)


abh*_*bhi 6

两个日期在swift中的比较.

    // Date comparision to compare current date and end date.
    var dateComparisionResult:NSComparisonResult = currentDate.compare(endDate)

    if dateComparisionResult == NSComparisonResult.OrderedAscending
    {
        // Current date is smaller than end date.
    }
    else if dateComparisionResult == NSComparisonResult.OrderedDescending
    {
        // Current date is greater than end date.
    }
    else if dateComparisionResult == NSComparisonResult.OrderedSame
    {
        // Current date and end date are same.
    }
Run Code Online (Sandbox Code Playgroud)

  • 不完全的.NSDate类型代表一个时间点; 它包含日期元素和时间元素.因此,您的代码会比较两个时间点,而不是原始问题中的预期日历日期. (4认同)

Log*_*han 6

对于 iOS7 支持

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date1String = dateFormatter.stringFromDate(date1)
let date2String = dateFormatter.stringFromDate(date2)
if date1String == date2String {
    println("Equal date")
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 5

您可以使用它的描述来比较两个日期。

let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
if date1.description == date2.description {
    print(true)
} else {
    print(false)   // false (I have added 2 seconds between them)
}
Run Code Online (Sandbox Code Playgroud)

如果要将日期的时间元素设置为不同的时间,可以执行以下操作:

extension NSDate {
    struct Calendar {
        static let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    }
    var day:    Int { return Calendar.gregorian.component(.Day,    fromDate: self)   }
    var month:  Int { return Calendar.gregorian.component(.Month,  fromDate: self)  }
    var year:   Int { return Calendar.gregorian.component(.Year,   fromDate: self)  }

    var noon: NSDate {
        return Calendar.gregorian.dateWithEra(1, year: year, month: month, day: day, hour: 12, minute: 0, second: 0, nanosecond: 0)!
    }
}

let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
print(date1.noon == date2.noon)   // true
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用 NSDateFormatter 来做到这一点:

extension NSDate {
    struct Date {
        static let formatterYYYYMMDD: NSDateFormatter = {
            let formatter = NSDateFormatter()
            formatter.dateFormat = "yyyyMMdd"
            return formatter
        }()
    }
    var yearMonthDay: String {
        return Date.formatterYYYYMMDD.stringFromDate(self)
    }
    func isSameDayAs(date:NSDate) -> Bool {
        return yearMonthDay == date.yearMonthDay
    }
}

let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
print(date1.yearMonthDay == date2.yearMonthDay)   // true

print(date1.isSameDayAs(date2))    // true
Run Code Online (Sandbox Code Playgroud)

另一种选择(iOS8+)是使用日历方法 isDate(inSameDayAsDate:):

extension NSDate {
    struct Calendar {
        static let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    }
    func isInSameDayAs(date date: NSDate) -> Bool {
        return Calendar.gregorian.isDate(self, inSameDayAsDate: date)
    }
}
let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
if date1.isInSameDayAs(date: date2 ){
    print(true)   // true
} else {
    print(false)
}
Run Code Online (Sandbox Code Playgroud)


Adr*_*ian 5

我写了一个 Swift 4 扩展来比较两个日期:

import Foundation

extension Date {      
  func isSameDate(_ comparisonDate: Date) -> Bool {
    let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
    return order == .orderedSame
  }

  func isBeforeDate(_ comparisonDate: Date) -> Bool {
    let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
    return order == .orderedAscending
  }

  func isAfterDate(_ comparisonDate: Date) -> Bool {
    let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
    return order == .orderedDescending
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

startDate.isSameDateAs(endDate) // returns a true or false