在NSDate数组中查找匹配项 - Swift

时间:2016-05-06 15:34:01

标签: arrays swift nsdate match date-manipulation

我是Swift(和一般编码)和堆栈溢出的新手。 SO在学习如何编写代码方面非常有帮助,所以,无数感谢SO社区提供了很好的问题和答案。

这是我的第一个问题......

我已经在这个挑战中旋转了几天。我已阅读并尝试了多种建议的解决方案,但到目前为止,它们都没有对我有用。

我有一个从Web API检索的动态NSDate数组(使用前面的代码)。

[2016-05-01 03:27:22 +0000, 2016-05-01 03:27:24 +0000, 2016-05-01 03:27:25 +0000, 2016-05-01 03:27:27 +0000, 2016-05-03 12:48:07 +0000, 2016-05-03 12:48:09 +0000, 2016-05-03 12:48:11 +0000, 2016-05-03 12:48:13 +0000, 2016-05-03 19:52:46 +0000, 2016-05-03 19:52:51 +0000, 2016-05-03 19:52:56 +0000, 2016-05-04 00:37:27 +0000, 2016-05-04 00:37:30 +0000, 2016-05-04 12:36:17 +0000, 2016-05-04 12:36:19 +0000, 2016-05-04 12:46:26 +0000, 2016-05-04 12:46:28 +0000, 2016-05-04 17:39:31 +0000, 2016-05-04 17:39:34 +0000, 2016-05-04 17:54:24 +0000, 2016-05-04 23:46:20 +0000]

我设置了一个循环上面数组的方法,并检查数组中是否有任何项目在最后x分钟内加上时间戳。

    func prepareJSONData1 () {

    let currentDate = NSDate()
    var startDate = currentDate.dateByAddingTimeInterval(-5 * 60) //sets the start date to 5 minutes prior to current time


    while startDate.compare(currentDate) != NSComparisonResult.OrderedDescending  {

        var i = Int(0) //setting up a counter

        for i in 0...self.quantumArrayNSDate.count - 1 {

            if startDate == self.quantumArrayNSDate[i] {
                print("Data entry found for \(startDate) timestamp")
            }
            self.i += 1
        }

        startDate = startDate.dateByAddingTimeInterval(1) //increment through the NSDate range

    }
}

无论我设置开始日期多久(即使我回去几个月),我也无法获得此代码来返回匹配的项目。我怀疑我没有正确设置startDate变量,因为如果我将这段代码更改为:

startDate = quantumArrayNSDate.first!

然后代码返回数组中的所有项目,正如我所期望的那样。

我也尝试过这种方法而没有任何成功:

let calendar = NSCalendar.currentCalendar()
    let startDate = calendar.dateByAddingUnit(.Minute, value: -5, toDate: NSDate(), options: [])!     // <- this didn't work

如果有人能够指出我做错了什么并提出解决方案,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

NSDate代表一个时间点,并存储为时间间隔 自参考日期2001年1月1日UTC以来的秒数。此时间间隔是一个浮点数(NSTimeInterval又名Double) 并包括小数秒。所以两个NSDate 在同一秒内创建的可以是不同的:

let date1 = NSDate()
let date2 = NSDate()
print(date1 == date2)
// false
print(date2.timeIntervalSinceDate(date1))
// 5.00679016113281e-06

您的平等测试

if startDate == self.quantumArrayNSDate[i]
除非两个日期代表完全相同的时间点,否则

会失败 小数秒精度。

您可以在给定时间间隔内迭代日期 与

for date in quantumArrayNSDate {
    if date.compare(startDate) == .OrderedDescending
     && date.compare(currentDate) == .OrderedAscending {
        // ... 
    }
}

或使用

获取匹配日期列表
let filteredDates = quantumArrayNSDate.filter { date in
    date.compare(startDate) == .OrderedDescending
        && date.compare(currentDate) == .OrderedAscending
}

要检查两个日期是否等于第二粒度,您可以使用

if calendar.compareDate(date, toDate: currentDate, toUnitGranularity: .Second) == .OrderedSame {
   // ...
}