检查日期是否介于两个日期之间

Exc*_*ons 24 swift

我有这个代码将String转换为日期对象

let date2 = KeysData[indexPath.row]["starttime"] as? String

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

if let date = dateFormatter.dateFromString(date2!) {
   println(date)          
}
Run Code Online (Sandbox Code Playgroud)

我想知道如果当前日期落在2天我的阵列中得到之间startdateendate

Nik*_*uhe 112

斯威夫特≧3

Swift 3让这更容易.

let fallsBetween = (startDate ... endDate).contains(Date())
Run Code Online (Sandbox Code Playgroud)

现在,这NSDate是桥接到值类型DateDate符合Comparable我们可以只是形成一个ClosedRange<Date>并使用该contains方法来查看当前日期是否包括在内.

警告:endDate必须大于或等于startDate.否则无法形成范围,代码会崩溃fatalError.

这很安全:

extension Date {
    func isBetween(_ date1: Date, and date2: Date) -> Bool {
        return (min(date1, date2) ... max(date1, date2)).contains(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个警告,如果startDate晚于endDate,应用程序将崩溃.除非你100%肯定永远不会是这种情况,否则你可能想要添加`guard startDate <endDate else {...} (4认同)
  • ```date1 ... date2~ = self```? (4认同)
  • 可能值得编辑您以前接受的答案.这很棒! (3认同)

Nik*_*uhe 55

斯威夫特2

如需更好的答案,请参阅Swift≧3.

你已经在你的日期字符串转换的代码KeysDataNSDate.假设你有两个日期中startdateenddate,所有你所要做的就是检查当前日期之间:

let startDate = ...
let endDate = ...

NSDate().isBetween(date: startDate, andDate: endDate)

extension NSDate {
    func isBetweeen(date date1: NSDate, andDate date2: NSDate) -> Bool {
        return date1.compare(self) == self.compare(date2)
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果要执行包含范围检查,请使用以下条件:

 extension NSDate {
    func isBetween(date date1: NSDate, andDate date2: NSDate) -> Bool {
        return date1.compare(self).rawValue * self.compare(date2).rawValue >= 0
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的"技巧",但也许应该补充说,这将检查"严格介于"之间,即不包括开始日期和结束日期(可能需要也可能不需要). (3认同)

Zhe*_*ich 5

对于Swift 4.2,我根据上述答案使用了此扩展名:

extension Date {
    func isBetween(_ date1: Date, and date2: Date) -> Bool {
        return (min(date1, date2) ... max(date1, date2)) ~= self
    }
Run Code Online (Sandbox Code Playgroud)

不过要小心。如果此扩展名不包含您的开始日期(date1),请检查日期。可能是您需要缩短日期才能解决问题。例如,像这样:

let myDateWithoutTime = Calendar.current.startOfDay(for: myDate)
Run Code Online (Sandbox Code Playgroud)


Tru*_*an1 5

DateInterval有一个.contains函数(参见文档):

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你像这样使用它:

let date = Date()
let date1 = Date(timeIntervalSinceNow: 1000)
let date2 = Date(timeIntervalSinceNow: -1000)
date.isBetween(date1, date2) // true
Run Code Online (Sandbox Code Playgroud)

请注意,如果您需要的话,这包括结束日期,或者添加 aguard来捕获它:

guard self != max(date1, date2) || self == min(date1, date2) else { return false }
Run Code Online (Sandbox Code Playgroud)

经过一些重构后,您可能会得到如下结果:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

那么这将通过以下测试用例:

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))
Run Code Online (Sandbox Code Playgroud)