我是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
如果有人能够指出我做错了什么并提出解决方案,我将非常感激。谢谢!
答案 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 {
// ...
}