检查日期是否与日期格式匹配



所以这是相当直接的代码。我有一个输入日期,我想根据特定的格式进行验证(输入日期应该完全匹配指定的日期格式),所以我使用以下代码,输入一个无效日期(应该匹配失败),但令我惊讶的是,它匹配日期格式并返回一个有效日期

import Foundation
let inputValue = "12/10/199" // Returns valid date even for "12/10.199"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

if let dateOfBirth = dateFormatter.date(from: inputValue) {
print("Valid date (dateOfBirth)") // Prints Valid date. Why?
}
else {
print("Invalid date")
}

控制台输出

Valid date 0199-10-11 18:06:32 +0000

根据Unicode日期格式模式,只有两位数字年份格式yy也检查长度,3y和更多y的数量添加前导零。

我的建议是用正则表达式验证字符串格式(整个字符串必须是2位数后面跟着斜杠后面跟着2位数后面跟着斜杠后面跟着4位数),并使用iOS 15/macOS 12中引入的新的日期ParseStrategyAPI,它比抽象字符串日期格式模式更容易理解。

let inputValue = "12/10/199"
let strategy = Date.ParseStrategy(format: "(day: .twoDigits)/(month: .twoDigits)/(year: .defaultDigits)",
timeZone: .current)
if let _ = inputValue.range(of: #"^d{2}/d{2}/d{4}$"#, options: .regularExpression),
let dateOfBirth = try? Date(inputValue, strategy: strategy) {
print("Valid date (dateOfBirth)")
}
else {
print("Invalid date")
}

在iOS 16/macOS 10.13中,regex验证将包含在ParseStrategy中。

不要将用作日期格式化程序格式的字符串误认为正则表达式。如果解析的字符串使用"-"作为日期组件之间的分隔符,这也可以工作。

最新更新