Swift:将Int类型日期转换为Date并比较时遇到错误
解决Swift日期转换与比较的问题
嘿,我帮你揪出代码里的几个关键错误啦,正是这些问题导致你没法把字符串转成Date类型:
核心错误点
- 变量赋值与类型错误:
你搞混了年份和月份的变量对应关系,而且第一行的类型声明完全写错了!比如let miesiacOd : 2017应该是let miesiacOd: Int = 10(miesiac是波兰语的“月份”,rok是“年份”,所以年份值要给rok开头的变量,月份值给miesiac开头的变量)。 - 日期格式化字符串不匹配:
你用%02d格式化年份,但DateFormatter设置的是yyyy-MM-dd(四位数年份),这会导致年份被截断成两位(比如2017变成0017),解析自然失败。年份应该用%04d来保证四位数格式。
修正后的完整代码
// 正确定义起始日期的年、月、日变量 let rokOd: Int = 2017 let miesiacOd: Int = 10 let dzienOd: Int = 1 // 年份用%04d,确保生成符合yyyy-MM-dd格式的字符串 let dataOd = String(format: "%04d-%02d-%02d", rokOd, miesiacOd, dzienOd) // 同样修正结束日期的变量 let rokDo: Int = 2018 let miesiacDo: Int = 10 let dzienDo: Int = 1 let dataDo = String(format: "%04d-%02d-%02d", rokDo, miesiacDo, dzienDo) let dateFormatter2 = DateFormatter() dateFormatter2.dateFormat = "yyyy-MM-dd" // 现在可以安全地转换并比较日期了 if let dataOd2 = dateFormatter2.date(from: dataOd), let dataDo2 = dateFormatter2.date(from: dataDo) { // 执行日期比较逻辑 switch dataOd2.compare(dataDo2) { case .orderedAscending: print("起始日期早于结束日期") case .orderedDescending: print("起始日期晚于结束日期") case .orderedSame: print("两个日期完全相同") } } else { print("日期转换失败,请检查格式是否正确") }
更可靠的日期创建方式(可选)
其实你可以跳过字符串格式化的步骤,直接用DateComponents创建Date对象,这样能避免字符串格式不匹配的问题:
// 创建起始日期的组件 var startComponents = DateComponents() startComponents.year = 2017 startComponents.month = 10 startComponents.day = 1 // 创建结束日期的组件 var endComponents = DateComponents() endComponents.year = 2018 endComponents.month = 10 endComponents.day = 1 // 通过日历生成Date对象 if let dataOd2 = Calendar.current.date(from: startComponents), let dataDo2 = Calendar.current.date(from: endComponents) { // 这里直接比较日期即可 if dataOd2 < dataDo2 { print("起始日期更早") } }
内容的提问来源于stack exchange,提问作者Łukasz Betta
相关产品推荐
相关产品推荐

