如何查看两个日期之间是否有日期?例如,我想检查当前日期是否在12月15日和1月15日之间。
这可以是任何年份,所以我当前的日期可以是2023年12月15日,它应该返回true。如果是12月14日或任何一年的1月16日,则应该返回false。31 December应该返回true。
这是我尝试过的:
let now = currentDateProvider()
dateFormatter.dateFormat = "yyyy-MM-dd"
let year = Calendar.current.component(.year, from: now)
guard let start = dateFormatter.date(from: "(year)-01-01"),
let end = dateFormatter.date(from: "(year)-01-07") else {
return false
}
if start <= now && now <= end {
return true
}
guard let start = dateFormatter.date(from: "(year)-12-01"),
let end = dateFormatter.date(from: "(year)-12-31") else {
return false
}
let value = start <= now && now <= end
return value
但是它看起来有点错误,因为如果我的时区是UTC +2,那么结束日期显示的是12月30日22:00:00,因为UTC +2是12月31日00:00 - 2小时,它显示的是12月30日而不是31日。
理想情况下,我希望不必为日期分开检查,只需在12月15日至1月15日之间进行一次包容性检查,而不是检查12月15日至12月31日和1月1日至1月7日。
我将获取日期的月份和日期组件,并对值进行简单的比较
let components = Calendar.current.dateComponents([.month, .day], from: date)
let inPeriod = (components.month! == 12 && components.day! >= 15) || (components.month! == 1 && components.day! <= 15)
简单测试用例
var testDate = Calendar.current.date(from: DateComponents(calendar: .current, year: 2021, month: 12, day: 14))!
for _ in 1...34 {
let components = Calendar.current.dateComponents([.month, .day], from: testDate)
print(testDate, (components.month! == 12 && components.day! >= 15) || (components.month! == 1 && components.day! <= 15))
testDate = Calendar.current.date(byAdding: .day, value: 1, to: testDate)!
}
不能忽略年份,特别是当年轮在间隔内时。作为当前实际上,您需要检查日期是否在当前的12月之内。下一个的年度和一月年
我的建议是从当前日期获得年份组件,然后通过将月设置为12和日设置为15来构建开始日期,并通过在指向下一年1月16日的开始日期上添加一天和一个月来构建结束日期。
let currentDate = Date.now
let year = Calendar.current.component(.year, from: currentDate)
let startComponents = DateComponents(year: year, month: 12, day: 15)
let startDate = Calendar.current.date(from: startComponents)!
let endDate = Calendar.current.date(byAdding: DateComponents(month: 1, day: 1), to: startDate)!
if currentDate >= startDate && currentDate < endDate {
print("isValid")
}
我要救赎自己!
-
没有看到您正在寻找一个考虑到您的时区的解决方案
-
没想到你想要一个只对时间间隔感兴趣而对年份不感兴趣的东西。
我必须承认,有时候我读的时候没有注意问题,特别是那些我认为很容易的问题。
希望下面的解决方案能满足您的需求。正如其他学院所说,你没有办法不考虑年份,但你可以在函数中模拟年份,就像你做的那样。
你自己看看,看你是更喜欢我的解决方案还是坚持你的。
import Foundation
let f = ISO8601DateFormatter()
f.formatOptions = .withFullDate
f.timeZone = TimeZone(abbreviation: "PST")
func thisDate(_ date: Date, isBetweenthisMonth initialMonth: Int, andDay initialDay: Int, andThisOtherMonth finalMonth: Int, andThisOtherDay finalDay: Int) -> Bool {
var isBetween = false
let year = Calendar.current.component(.year, from: date)
let initialYear = year
var finalYear = year
if finalMonth < initialMonth {
finalYear += finalYear
}
let initialFakeData = f.date(from: "(initialYear)-(initialMonth)-(initialDay)")!
let finalFakeData = f.date(from: "(finalYear)-(finalMonth)-(finalDay)")!
if (date > initialFakeData && date < finalFakeData) {
isBetween = true
}
return isBetween
}
// Some test cases to pass
let date = f.date(from: "2022-11-01")!
print(thisDate(date, isBetweenthisMonth: 12, andDay: 02, andThisOtherMonth: 02, andThisOtherDay: 23) == false ? "False" : "Something wrong.")
print(thisDate(date, isBetweenthisMonth: 10, andDay: 02, andThisOtherMonth: 01, andThisOtherDay: 15) == true ? "True" : "Something wrong.")
let date2 = f.date(from: "2022-12-31")!
print(thisDate(date2, isBetweenthisMonth: 12, andDay: 30, andThisOtherMonth: 01, andThisOtherDay: 01) == true ? "True" : "Something wrong.")
print(thisDate(date2, isBetweenthisMonth: 01, andDay: 01, andThisOtherMonth: 01, andThisOtherDay: 15) == false ? "False" : "Something wrong.")
let date_now = f.date(from: f.string(from: Date()))!
print(thisDate(date_now, isBetweenthisMonth: 11, andDay: 08, andThisOtherMonth: 11, andThisOtherDay: 10) == true ? "True" : "Something wrong.")
print(thisDate(date_now, isBetweenthisMonth: 12, andDay: 01, andThisOtherMonth: 02, andThisOtherDay: 01) == false ? "False" : "Something wrong.")
我不知道如何在playground中使用XCTest,所以我在最后的代码中模拟了一些测试。