我在数据库中查询startDate和endDate之间的值。因此,我正在寻找一种巧妙的方式来获得NSDate以结束一天的约会。就像你可以获得startOfDayForDate()。
我想你可以做到:
let cal = NSCalendar.currentCalendar()
let startOfDay = cal.startOfDayForDate(NSDate())
let aDay:NSTimeInterval = 60*60*23 + 60*59 + 59
let endofDay = startOfDay.dateByAddingTimeInterval(aDay)
将start.day + 1添加到startOfDayForDate是一个正确的方法来获取日期的“当天结束”,还是有更好的方法?
答案 0 :(得分:8)
更好的方法是获取第二天的开始并减去0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001秒。
你得到我想说的话吗?定义一天的结束非常困难。 23:59肯定不是一天的结束,差不多整整一分钟,直到第二天。甚至23:59:59也不是一天的结束。因为在这个时间和第二天的开始之间存在无限的分数秒。据我所知,NSDate支持纳秒开箱即用,因此在目前的实施中,在23:59:59和第二天之间至少有1 000 000 000 NSD。
这就是为什么你应该看看你是否能找到一种方法来使用第二天的开始。
例如,您可以使用if (startOfDay <= date && date <= endOfDay)
代替if (startOfDay <= date && date < startOfNextDay)
。
要计算第二天的开始,您必须使用NSCalendar。在iOS8中,Apple添加了一些很好的方法来简化这些计算:
let calendar = NSCalendar.currentCalendar()
let startOfDay = calendar.startOfDayForDate(NSDate())
let startOfNextDay = calendar.dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: startOfDay, options: nil)!
编辑:由于您现在声明要查询数据库,因此无需查找当天结束。检查日期是在当天开始时或之后,以及在第二天开始之前。
答案 1 :(得分:2)
试试这个:
var endOfDay: Date? {
var components = DateComponents()
components.day = 1
components.second = -1
var calendar = Calendar.current
calendar.timeZone = TimeZone(abbreviation: "GMT")!
return calendar.date(bySettingHour: 11, minute: 59, second: 59, of: Date())
}