【问题标题】:How can i compare two dates (NSDate) in Swift 3 and get the days between them?如何在 Swift 3 中比较两个日期(NSDate)并获取它们之间的日期?
【发布时间】:2017-04-02 03:47:43
【问题描述】:

如何在 Swift 3 中比较两个日期? 我为其他 Swift 版本找到了许多解决方案,但它们对我不起作用。

let clickedDay:String = currentcell.DayLabel.text!
    let currentDate = NSDate()
    let currentDay = "" //want the current day
    let dateFormatter = DateFormatter()        
    var dateAsString = ""        
    if Int(clickedDay)! < 10 {            
        dateAsString = "0" + clickedDay + "-11-2016 GMT"
    }
    else {            
        dateAsString = clickedDay + "-11-2016 GMT"
    }

    dateFormatter.dateFormat = "dd-MM-yyyy zzz"
    let clickedDate = dateFormatter.date(from: dateAsString)        
    if currentDate as Date >= clickedDate! as Date {

        return true
    }
    else {
        //Want to get the days between the currentDate and clickedDate
        let daysLeft = ""
    }

我比较了两个日期,但我想要两个日期之间的日期。 有人可以帮我吗? 谢谢和问候

添加: 如果我有日期 22.11.2016 和 currentdate(现在 18.11.2016),我想要这之间的天数(在本例中为 4)

【问题讨论】:

    标签: swift xcode swift3 nsdate date-comparison


    【解决方案1】:

    只需像这样扩展Date 并在几天内获得差异。

    extension Date {
        func daysBetweenDate(toDate: Date) -> Int {
            let components = Calendar.current.dateComponents([.day], from: self, to: toDate)
            return components.day ?? 0
        }
    }
    

    现在像这样使用这个扩展

    let numOfDays = fromDate.daysBetweenDate(toDate: toDate)
    

    您可以像这样使用DateFormatter 将字符串转换为日期。

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy"
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
    let date = dateFormatter.date(from: "18-11-2016")
    

    【讨论】:

    • 我在哪里声明扩展?
    • 得到这个错误:使用未解析的标识符'fromDate'
    • 那行得通,但如果我有 18.11.2016(从日期)和 22.11.2016(今天),它说 3 天
    • 我如何给他们正确的时区?像这样: dateAsString = clickedDay + "-11-2016 GMT" ??
    • @Mbach 检查编辑后的答案以将字符串转换为日期,无需在 dateString 中添加“GMT”。
    【解决方案2】:

    试试这个

    let startDateComparisionResult:ComparisonResult = currentDate.compare(clickedDate! as NSDate)
    
    if startDateComparisionResult == ComparisonResult.orderedAscending
    {
        // Current date is smaller than end date.
    }
    else if startDateComparisionResult == ComparisonResult.orderedDescending
    {
        // Current date is greater than end date.
    }
    else if startDateComparisionResult == ComparisonResult.orderedSame
    {
        // Current date and end date are same
    }
    

    【讨论】:

    • 取决于您的 currentDate 和 clickedDate 值
    【解决方案3】:

    使用此函数获取两个日期之间的所有中间日期,只需检查down date(最终日期)是否大于up date(第一个日期)然后 order 为 +1,否则 order -1 :-

    func selectDates(from upDate : Date, to downDate : Date, order : Int){
            var selectDate = Calendar.current.date(byAdding: .day, value: order, to: upDate)!
            while compareDate(dateInitial: selectDate, dateFinal: downDate) != true{
                print(" intermediate date is \(selectDate)")
                selectDate = Calendar.current.date(byAdding: .day, value: order, to: selectDate)!
            }
            print("*** intermediate dates are selected ***")
    
        }
    
    
    func compareDate(dateInitial:Date, dateFinal:Date) -> Bool {
            let order = Calendar.current.compare(dateInitial, to: dateFinal, toGranularity: .day)
            switch order {
            case .orderedSame:
                return true
            default:
                return false
            }
        }
    

    【讨论】:

    • 我要几天,到下一个日期还有多久
    【解决方案4】:

    试试:

    let days=Calendar.current.dateComponents([.day], from: date_1, to: date_2)
    let nb_days=days.day
    

    【讨论】:

    • 我要几天,到下一个日期还有多久
    • 我不确定我是否理解你。我的回答为您提供了 your_date 和 Date() 之间的天数(所以今天)。但是,如果您想与另一个日期进行比较,只需将 Date() 更改为 next_date。
    • 是的,这就是我想要的。但是在几天我没有号码,我怎么得到号码?
    • 对不起,我忘了第二部分 :) 我更新了我的答案@Mbach
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多