【问题标题】:How can I compare two dates in Swift 3.2?如何在 Swift 3.2 中比较两个日期?
【发布时间】:2017-12-29 11:59:57
【问题描述】:

我正在尝试比较两个日期。一个日期来自服务器,另一个是今天的日期。

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 条件内执行一些操作。
但是该循环永远不会执行,即使两者是相同的日期。有什么建议吗?

【问题讨论】:

  • 已更新,请立即查看。
  • 您的代码格式不正确,难以阅读。
  • 请立即查看。
  • 你试过isDateInToday()方法而不是isDate(_:inSameDayAs:)吗?
  • selectedDate: "12/12/2017 23:12" 看起来不像今天的日期

标签: swift date compare


【解决方案1】:

问题在于您没有正确解释时区。来自服务器的日期字符串可能是 UTC 而不是本地时间,因此您需要将 dateFormatter 时区设置为从 GMT TimeZone(secondsFromGMT: 0) 开始的零秒。第二个问题是您正在使用 MM,它在分钟内是一个月的 "HH: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)
        }
    }
}

【讨论】:

    【解决方案2】:

    用途:

    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
    

    大写 M 用于几个月而不是几分钟

    【讨论】:

    • 这里我只考虑日期而不是小时/分钟。
    • 但是由于格式错误,您得到的日期可能为零
    • 这就是我在答案中提供的
    【解决方案3】:

    据我了解,您希望从格式中排除小时和分钟。试试下面的代码:

    dateFormatter.timeStyle = DateFormatter.Style.none
    dateFormatter.dateStyle = DateFormatter.Style.short
    
    dateFormatter.string(from: date)
    

    截至今天,这将输出“12/29/17”。您可以通过这种方式获取没有小时:分钟的日期,然后进行比较。

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 2021-08-17
      • 2011-04-20
      • 1970-01-01
      • 2022-01-05
      • 2016-06-25
      相关资源
      最近更新 更多