【问题标题】:Comparing two dates for getting components比较两个日期以获取组件
【发布时间】:2020-11-16 17:56:18
【问题描述】:

我正在比较两个日期,当我们在同一个月执行操作时,它可以完美运行,但是当月份较高时,即 8 月 8 日,日期较低,假设 2,当前日期为 27,而 mont 为 7 月 7 日,所以对于这个比较我得到了错误的负值。

这是我的功能:

func countDonwn(isStumpStarted: Bool = false)-> String? {
    let date = Date()
    
    let calendar = Calendar.current
    let components = calendar.dateComponents([.hour, .minute, .second, .day], from: date as Date)
    let currentDate = calendar.date(from: components)?.toLocalTime()
    let userCalendar = Calendar.current
    guard let endDte = (self.getDate(defaultFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZ")) else {return nil }
    let competitionDate = calendar.dateComponents([.hour, .minute, .second, .day], from: endDte as Date)
    if endDte < (date as Date) {
        return ""
    }
    
    let competitionDay = userCalendar.date(from: competitionDate as DateComponents)!.toLocalTime()
    let CompetitionDayDifference = calendar.dateComponents([.day, .hour, .minute, .second], from: currentDate!, to: competitionDay)
    let daysLeft = CompetitionDayDifference.day
    let hoursLeft = CompetitionDayDifference.hour
    let minutesLeft = CompetitionDayDifference.minute
    let secondLeft = CompetitionDayDifference.second
    if daysLeft != 0 && !isStumpStarted {
        return "\(String(describing: daysLeft ?? 0))d \(String(format: "%02d", hoursLeft ?? 0)):\(String(format: "%02d", minutesLeft ?? 0)):\(String(format: "%02d", secondLeft ?? 0))"
        
    } else if daysLeft == 0 && hoursLeft == 0 && minutesLeft == 0 && secondLeft == 0 {
        return ""
    }
    
    return "\(String(format: "%02d", hoursLeft ?? 0)):\(String(format: "%02d", minutesLeft ?? 0)):\(String(format: "%02d", secondLeft ?? 0))"
}

【问题讨论】:

    标签: ios swift date nsdatecomponents


    【解决方案1】:

    可以使用 Calendar 函数和 DateComponents 执行日期比较

    let calendar = Calendar.current
    let delta = calendar.dateComponents([.hour, .minute, .second], 
                                        from: date, 
                                        to: endDte)
    
    print("\(String(format: "%02d", delta.hour!)):\(String(format: "%02d", delta.minute!)):\(String(format: "%02d", delta.second!))")
    

    所以我认为你的功能可以缩短为

    func countDonwn(isStumpStarted: Bool = false)-> String? {
        let date = Date()
    
        guard let endDte = (self.getDate(defaultFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZ")),
        date.compare(endDte) == .orderedAscending else {
            return nil
        }
    
        let calendar = Calendar.current
        let delta = calendar.dateComponents([.hour, .minute, .second], from: fromDate, to: toDate)
    
        return "\(String(format: "%02d", delta.hour!)):\(String(format: "%02d", delta.minute!)):\(String(format: "%02d", delta.second!))"
    }
    

    请注意,在调用 calendar.dateComponents(_ ,from:, to:) 函数时,可以强制解开 delta 的日期组件

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 2011-09-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多