【问题标题】:Issue while comparing two dates in swift快速比较两个日期时出现问题
【发布时间】:2020-01-27 09:59:48
【问题描述】:

我正在尝试比较两个日期,一个来自后端,第二个是当前日期。但它没有向我显示正确的结果,比如我的第一个日期是Jan 26, 2020,当前是Jan 27,2020,它不应该在我的数组中添加第一个日期。我只想要那些高于当前日期的日期。我的比较代码是这样的,

for date in dateRange
{
    let availableDate = dateFormatter.string(from: date as Date)
    //self.datesArray.append(availableDate + " | \(dateTime.startTime ?? "") - \(dateTime.endTime ?? "")")
    let dates = Date()
    let formatter = DateFormatter()
    formatter.dateFormat = "EEEE, MMM d, yyyy"
    let results = formatter.string(from: dates)
    if availableDate <= results
    {
        print("Past Date")
    }
    else
    {
        print(availableDate)
        print(results)
        self.datesArray.append(availableDate)
    }
}

每次迭代都会在 dateArray 中添加日期,我不知道为什么?

【问题讨论】:

  • 您应该使用日期格式MMM dd, yyyy 而不是EEEE, MMM d, yyyy

标签: swift date


【解决方案1】:

将日期转换为字符串并进行比较是一个非常糟糕的主意。

除了字符串格式无论如何都不可比较(例如Feb小于Jan

比较日期

for date in dateRange {            
   let now = Date()
   if date <= now {
       print("Past Date")
   } else {
       print(date)
       print(now)
       self.datesArray.append(date) // declare datesArray as [Date]
   }
}

或更简单

let filteredDates = dateRange.filter{ $0 > Date() }
self.datesArray.append(contentsOf: filteredDates)

【讨论】:

  • 感谢您保护我的时间。 @vadian
【解决方案2】:

要检查今天之后的日期,仅按日期而不是时间,请使用内置的 Date 类型而不是字符串,并使用 Calendar 类

let now = Date()
let calendar = Calendar.current
let datesArray = dateRange.filter { calendar.compare($0, to: now, toGranularity: .day) == .orderedDescending} 

为了获得最佳效果,您应该将timeZone 属性设置为传入日期的时区

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2011-09-30
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多