DateInterval
has a .contains
function for this (see docs):
extension Date {
func isBetween(_ date1: Date, _ date2: Date) -> Bool {
date1 < date2
? DateInterval(start: date1, end: date2).contains(self)
: DateInterval(start: date2, end: date1).contains(self)
}
}
Then you use it like this:
let date = Date()
let date1 = Date(timeIntervalSinceNow: 1000)
let date2 = Date(timeIntervalSinceNow: -1000)
date.isBetween(date1, date2) // true
Note that is inclusive of the end date if that's what you need, or add a guard
to capture it:
guard self != max(date1, date2) || self == min(date1, date2) else { return false }
After some refactoring you can end up with something like this:
extension Date {
func isBetween(_ date1: Date, _ date2: Date) -> Bool {
let minDate = min(date1, date2)
let maxDate = max(date1, date2)
guard self != minDate else { return true }
guard self != maxDate else { return false }
return DateInterval(start: minDate, end: maxDate).contains(self)
}
}
Then this will pass the following test cases:
XCTAssert(
try XCTUnwrap(Date(fromString: "2020/01/15 09:30")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 09:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 10:00"))
)
)
XCTAssert(
try XCTUnwrap(Date(fromString: "2020/01/16 01:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 23:00")),
try XCTUnwrap(Date(fromString: "2020/01/16 04:00"))
)
)
XCTAssert(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 10:30"))
)
)
XCTAssert(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 10:00"))
)
)
XCTAssert(
try XCTUnwrap(Date(fromString: "2020/01/15 09:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 08:00"))
)
)
XCTAssert(
try XCTUnwrap(Date(fromString: "2020/01/15 08:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 08:00"))
)
)
XCTAssertFalse(
try XCTUnwrap(Date(fromString: "2020/01/15 09:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 13:00"))
)
)
XCTAssertFalse(
try XCTUnwrap(Date(fromString: "2020/01/15 10:30")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 10:30"))
)
)
XCTAssertFalse(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")).isBetween(
try XCTUnwrap(Date(fromString: "2020/01/15 10:00")),
try XCTUnwrap(Date(fromString: "2020/01/15 08:00"))
)
)
let date = Date()
let date1 = Date(timeIntervalSinceNow: 1000)
let date2 = Date(timeIntervalSinceNow: -1000)
XCTAssert(date.isBetween(date1, date2))