2015-04-01 192 views
1

真的很簡單,我相信這是一個很快的bug。我試圖檢查2個NSDates是否相同。這種說法從來沒有通行證甚至以爲打印輸出低於Swift:檢查兩個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()))) 
} 

手繪POP練習13時56分50秒+0000手繪POP練習13時56分50秒+0000

手繪POP練習13點56分50秒+0000 2015年3月31日13點56分50秒+0000

2015年3月31日13點56分50秒+0000手繪POP練習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())) 

    } 
+0

剛纔試了很簡單的一個,它似乎有可能只是NSDate的()== NSDate的() – 2015-04-01 14:12:01

回答

3

檢查日期是否相等的最簡單方法是使用NSDate.isEqualToDate()方法。

NSCalendar.currentCalendar().compareDate(date1, toDate: date2, toUnitGranularity: NSCalendarUnit.CalendarUnitSecond) 

如果使用相當多的日期計算校驗this庫。

+0

我正在使用它,但它的返回錯誤,即使打印輸出顯示它們是相同的 – Burf2000 2015-04-01 14:09:48

+1

isEqualToDate()比較到亞秒級別。我認爲你的日期在亞秒級是不同的。如果您想在較高級別進行比較,請檢查NSCalendar API。特別是NSCalendar.compareDate。我改變了答案來反映它。 – Abdullah 2015-04-01 14:14:59

1

你可以使用這個擴展:

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") 
    } 

只是更改值你加或減。也許你必須使用dateformatter爲你的日期

+0

可悲的是不工作,它認爲日期是dif – Burf2000 2015-04-01 14:07:33

0

我居然發現這個新的方法來解決這個問題

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())) 

    } 
+0

所以實際上你想檢查兩個NSDates是否在*相同的小時*內,如果它們是相同的。如果你在你的問題中澄清這個問題,對未來的讀者會很有用。 – 2015-04-01 14:24:05

+0

不,但這是一個解決方法,看起來子秒可能是不同的事件,雖然時間是通過healthkit – Burf2000 2015-04-01 14:26:23

+1

NSDate代表絕對時間點。如果2個NSDate相差0.01秒,那麼它們是不同的。 – 2015-04-01 14:27:36

1

你應該能夠比較==操作符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") 
} 

如果我改變結束日期

dateComponents.second = 5 
endDate = calendar!.dateByAddingComponents(dateComponents, toDate: startDate, options: nil) 

if(startDate == endDate) // false here 
{ 
    println("equal") 
}