Swift : 检查 2 个 NSDates 是否相同
Swift : Checking if 2 NSDates are the same
非常简单,我确定这是 swift 中的错误。我正在尝试检查 2 个 NSDates 是否相同。即使打印输出低于
,此声明也永远不会通过
println("\(statistics.startDate) \(healthObject.date)")
if healthObject.date.isEqualToDate(statistics.startDate)
{
healthObject.flights = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))
println(Int(quantity.doubleValueForUnit(HKUnit.countUnit())))
}
2015-03-30 13:56:50 +0000 2015-03-30 13:56:50 +0000
2015-03-30 13:56:50 +0000 2015-03-31 13:56:50 +0000
2015-03-31 13:56:50 +0000 2015-03-30 13:56:50 +0000
2015-03-31 13:56:50 +0000 2015-03-31 13:56:50 +0000
解决方案
正如一位非常棒的人所指出的那样,直到亚秒级之前,日期可能都是一样的。奇怪的是,这些值是否来自 HealthKit
在 iOS8 中对我有用的是:
if let dif = calender?.compareDate(statistics.startDate, toDate: healthObject.date, toUnitGranularity: NSCalendarUnit.SecondCalendarUnit)
{
println(Int(quantity.doubleValueForUnit(HKUnit.countUnit())))
println("\(statistics.startDate) \(healthObject.date)")
healthObject.flights = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))
}
您可以使用此扩展程序:
extension NSDate
{
func isGreaterThanDate(dateToCompare : NSDate) -> Bool
{
if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
{
return true
}
return false
}
func isLessThanDate(dateToCompare : NSDate) -> Bool
{
if self.compare(dateToCompare) == NSComparisonResult.OrderedAscending
{
return true
}
return false
}
func isEqualToDate(dateToCompare : NSDate) -> Bool
{
if self.compare(dateToCompare) == NSComparisonResult.OrderedSame
{
return true
}
return false
}
}
扩展工作正常检查如下:
var date1 : NSDate = NSDate()
var date2 : NSDate = date1.dateByAddingTimeInterval(-100)
print("\(date1)-----\(date2)\n")
if date1.isEqualToDate(date2) {
print("date1 and date 2 are the same")
}else if date1.isLessThanDate(date2) {
print("date 1 is less than date2")
}else if date1.isGreaterThanDate(date2){
print("date1 is more than date 2")
}
只需更改您添加或减去的值。也许你必须为你的日期使用日期格式化程序
检查日期是否相等的最简单方法是使用 NSDate.isEqualToDate() 方法。
或
NSCalendar.currentCalendar().compareDate(date1, toDate: date2, toUnitGranularity: NSCalendarUnit.CalendarUnitSecond)
如果您使用了相当多的日期算术检查 this 库。
我真的找到了解决问题的新方法
let calender = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
if let dif = calender?.compareDate(statistics.startDate, toDate: healthObject.date, toUnitGranularity: NSCalendarUnit.HourCalendarUnit)
{
println(Int(quantity.doubleValueForUnit(HKUnit.countUnit())))
println("\(statistics.startDate) \(healthObject.date)")
healthObject.flights = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))
}
您应该能够将 NSDates 与 == 运算符进行比较 (xCode 6.2)。我尝试了以下简单的比较
let startDate = NSDate()
var dateComponents = NSDateComponents()
var calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
var endDate = calendar!.dateByAddingComponents(dateComponents, toDate: startDate, options: nil)
if(startDate == endDate) // true here
{
println("equal")
}
如果我更改 endDate
dateComponents.second = 5
endDate = calendar!.dateByAddingComponents(dateComponents, toDate: startDate, options: nil)
if(startDate == endDate) // false here
{
println("equal")
}
非常简单,我确定这是 swift 中的错误。我正在尝试检查 2 个 NSDates 是否相同。即使打印输出低于
,此声明也永远不会通过println("\(statistics.startDate) \(healthObject.date)")
if healthObject.date.isEqualToDate(statistics.startDate)
{
healthObject.flights = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))
println(Int(quantity.doubleValueForUnit(HKUnit.countUnit())))
}
2015-03-30 13:56:50 +0000 2015-03-30 13:56:50 +0000
2015-03-30 13:56:50 +0000 2015-03-31 13:56:50 +0000
2015-03-31 13:56:50 +0000 2015-03-30 13:56:50 +0000
2015-03-31 13:56:50 +0000 2015-03-31 13:56:50 +0000
解决方案 正如一位非常棒的人所指出的那样,直到亚秒级之前,日期可能都是一样的。奇怪的是,这些值是否来自 HealthKit
在 iOS8 中对我有用的是:
if let dif = calender?.compareDate(statistics.startDate, toDate: healthObject.date, toUnitGranularity: NSCalendarUnit.SecondCalendarUnit)
{
println(Int(quantity.doubleValueForUnit(HKUnit.countUnit())))
println("\(statistics.startDate) \(healthObject.date)")
healthObject.flights = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))
}
您可以使用此扩展程序:
extension NSDate
{
func isGreaterThanDate(dateToCompare : NSDate) -> Bool
{
if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
{
return true
}
return false
}
func isLessThanDate(dateToCompare : NSDate) -> Bool
{
if self.compare(dateToCompare) == NSComparisonResult.OrderedAscending
{
return true
}
return false
}
func isEqualToDate(dateToCompare : NSDate) -> Bool
{
if self.compare(dateToCompare) == NSComparisonResult.OrderedSame
{
return true
}
return false
}
}
扩展工作正常检查如下:
var date1 : NSDate = NSDate()
var date2 : NSDate = date1.dateByAddingTimeInterval(-100)
print("\(date1)-----\(date2)\n")
if date1.isEqualToDate(date2) {
print("date1 and date 2 are the same")
}else if date1.isLessThanDate(date2) {
print("date 1 is less than date2")
}else if date1.isGreaterThanDate(date2){
print("date1 is more than date 2")
}
只需更改您添加或减去的值。也许你必须为你的日期使用日期格式化程序
检查日期是否相等的最简单方法是使用 NSDate.isEqualToDate() 方法。
或
NSCalendar.currentCalendar().compareDate(date1, toDate: date2, toUnitGranularity: NSCalendarUnit.CalendarUnitSecond)
如果您使用了相当多的日期算术检查 this 库。
我真的找到了解决问题的新方法
let calender = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
if let dif = calender?.compareDate(statistics.startDate, toDate: healthObject.date, toUnitGranularity: NSCalendarUnit.HourCalendarUnit)
{
println(Int(quantity.doubleValueForUnit(HKUnit.countUnit())))
println("\(statistics.startDate) \(healthObject.date)")
healthObject.flights = Int(quantity.doubleValueForUnit(HKUnit.countUnit()))
}
您应该能够将 NSDates 与 == 运算符进行比较 (xCode 6.2)。我尝试了以下简单的比较
let startDate = NSDate()
var dateComponents = NSDateComponents()
var calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
var endDate = calendar!.dateByAddingComponents(dateComponents, toDate: startDate, options: nil)
if(startDate == endDate) // true here
{
println("equal")
}
如果我更改 endDate
dateComponents.second = 5
endDate = calendar!.dateByAddingComponents(dateComponents, toDate: startDate, options: nil)
if(startDate == endDate) // false here
{
println("equal")
}