DateInterval 对此有一个 .contains 函数 (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)
}
}
然后你这样使用它:
let date = Date()
let date1 = Date(timeIntervalSinceNow: 1000)
let date2 = Date(timeIntervalSinceNow: -1000)
date.isBetween(date1, date2) // true
如果您需要,请注意包括结束日期,或者添加 guard 来捕获它:
guard self != max(date1, date2) || self == min(date1, date2) else { return false }
经过一些重构后,您可以得到如下结果:
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)
}
}
那么这将通过以下测试用例:
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))