【问题标题】:Swift : Checking if 2 NSDates are the sameSwift:检查 2 个 NSDates 是否相同
【发布时间】:2015-04-01 13:55:58
【问题描述】:

真的很简单,我确信这是 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()))

   }

【问题讨论】:

  • 刚刚尝试了一个非常简单的,似乎可以只使用 NSDate() == NSDate()

标签: ios swift nsdate


【解决方案1】:

检查日期是否相等的最简单方法是使用 NSDate.isEqualToDate() 方法。

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

如果你使用了大量的日期算术检查 this 库。

【讨论】:

  • 我正在使用它,但它返回 false,即使打印输出显示它们是相同的
  • isEqualToDate() 比较亚秒级。我认为你的日期在亚秒级是不同的。如果您想在更高级别进行比较,请检查 NSCalendar API。特别是 NSCalendar.compareDate。我更改了答案以反映它。
【解决方案2】:

您应该能够将 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")
}

【讨论】:

    【解决方案3】:

    你可以使用这个扩展:

    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

    【讨论】:

      【解决方案4】:

      我确实找到了解决问题的新方法

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

      【讨论】:

      • 所以实际上您想检查 2 个 NSDate 是否在 同一小时 内,而不是它们是否相同。如果您在问题中澄清这一点,将对未来的读者有用。
      • 不,但这是一种解决方法,尽管时间是通过 healthkit 进行的,但似乎亚秒可能是不同的事件
      • NSDate 表示绝对时间点。如果 2 个 NSDate 相差 0.01 秒,则它们是不同的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2016-02-02
      相关资源
      最近更新 更多