结束约会的好方法?

Neat way to get end of day for date?

我在数据库中查询 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)

将 component.day + 1 添加到 startOfDayForDate 是获取日期 "end of the day" 的正确方法,还是有更好的方法?

A better way would be to get the start of the next day and subtract 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 second.

你明白我想说的吗?很难定义一天的结束。 23:59当然不是一天的结束,距离第二天还有将近整整一分钟。甚至 23:59:59 也不是一天的结束。因为在这个时间和第二天开始之间有无限多的小数秒。据我所知,NSDate 开箱即用地支持纳秒,因此在当前的实现中,在 23:59:59 和第二天之间至少有 1 000 000 000 个可能的 NSDate。

这就是为什么您应该看看是否可以找到使用第二天开始的方法的原因。

例如,您可以使用 if (startOfDay <= date && date < startOfNextDay) 而不是 if (startOfDay <= date && date <= endOfDay)

要计算第二天的开始时间,您必须使用 NSCalendar。在 iOS8 中,Apple 添加了一些不错的方法来简化这些计算:

let calendar = NSCalendar.currentCalendar()
let startOfDay = calendar.startOfDayForDate(NSDate())
let startOfNextDay = calendar.dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: startOfDay, options: nil)!

编辑:由于您现在声明要查询数据库,因此您不需要查找当天的结束时间。检查日期是否在当天开始之前或之后,以及第二天开始之前。

试试这个:

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