我有这个代码将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天我的阵列中得到之间startdate
和endate
Nik*_*uhe 112
Swift 3让这更容易.
let fallsBetween = (startDate ... endDate).contains(Date())
Run Code Online (Sandbox Code Playgroud)
现在,这NSDate
是桥接到值类型Date
并Date
符合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)
Nik*_*uhe 55
如需更好的答案,请参阅Swift≧3.
你已经在你的日期字符串转换的代码KeysData
来NSDate
.假设你有两个日期中startdate
和enddate
,所有你所要做的就是检查当前日期之间:
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)
对于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)
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)