我想比较两个日期。一个日期来自服务器,另一个日期是今天的日期。
for i in 0...self.totalDaysFromServerArray.count-1 {
let selectedDate = self.totalDaysFromServerArray[i] //selectedDate: "12/12/2017 23:12"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:MM"
let date = dateFormatter.date(from: }selectedDate)
}
if Calendar.current.isDate((date)!, inSameDayAs:todayDate as Date) == true {
}
打印日期说明:
▿ Optional<Date>
▿ some : 2017-12-29 17:30:00
let todayDate = Date()
//Printing description of todayDate:
▿ 2017-12-29 11:50:45
如果两个日期相同,我最终必须在if条件内执行一些 但是,即使两个日期相同,该循环也永远不会执行。有什么建议吗?
答案 0 :(得分:1)
问题在于您没有正确解释时区。来自服务器的日期字符串可能是UTC而不是本地时间,因此您需要将GMT TimeZone(secondsFromGMT: 0)
的dateFormatter时区设置为零秒。第二个问题是你在分钟"HH:mm"
中使用MM的月份。第三个问题是您还忘记使用"/"
而不是"-"
作为分隔符,日期字符串的正确固定日期格式应为"dd/MM/yyyy HH:mm"
。第四,解析固定日期格式时,需要将dateFormatter语言环境设置为"en_US_POSIX"
。它是数组还是字典? 6 : "18/12/2017 23:12"
看起来像[Int:String]
字典。您还需要在循环中移动if条件,并且上面的评论中没有与今天匹配的日期,因此我将添加一个仅用于演示目的的匹配日期。
let totalDaysFromServerArray = ["18/12/2017 23:12", "19/12/2017 23:12", "20/12/2017 23:12", "21/12/2017 23:12", "29/12/2017 23:12"]
for dateString in totalDaysFromServerArray {
print("server:", dateString)
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "dd/MM/yyyy HH:mm"
if let date = dateFormatter.date(from: dateString) {
print("parsed:", dateFormatter.string(from: date))
print("match:", dateString == dateFormatter.string(from: date))
if Calendar.current.isDate(date, inSameDayAs: Date()) {
print("inSameDayAsToday:", true)
}
}
}
答案 1 :(得分:0)
使用:
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
资本M用于数月而非分钟
答案 2 :(得分:0)
在操场上试过你的代码:
let date1 = "12/12/2017 23:12" //Date you are passing
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:MM"
let date = dateFormatter.date(from: date1)
let todayDate = Date()
if Calendar.current.isDate((date)!, inSameDayAs:todayDate) == true {
print("Both dates are same")
} else {
print("Both dates are not same")
}
将打印出正确的Both dates are not same
。
但如果您将let date1 = "12/12/2017 23:12"
替换为let date1 = "29/12/2017 23:12"
,则会打印Both dates are same
。
答案 3 :(得分:0)
据我所知,您希望从格式中排除小时和分钟。请尝试以下代码:
dateFormatter.timeStyle = DateFormatter.Style.none
dateFormatter.dateStyle = DateFormatter.Style.short
dateFormatter.string(from: date)
这输出&#34; 12/29/17&#34;截至今日。您可以通过这种方式获得没有时间的日期:分钟,然后进行比较。