web-dev-qa-db-fra.com

swift 3 comment obtenir une date pour demain et hier (attention particulière) nouveau mois ou nouvelle année

Je travaille sur le calendrier de données pour chaque mois en cours Et je devrais montrer 3 types de calcul pour (hier - aujourd'hui - demain)

Je tombe en panne à cause de (index hors limite) pour cas particulier Comme si ce jour date (31 mai 2017) avoir une erreur (parce que je devrais connaître son nouveau mois demain)

C'est mon code 

class ViewController: UIViewController {
    var dateComponents: DateComponents!
    var TimeToday :[String] = []
    var TimeTomorrow :[String] = []
    var TimeYesterday :[String] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        let dateDay = Date()
        let calendar = Calendar(identifier: .gregorian)
        dateComponents = calendar.dateComponents([.day, .month, .year], from: dateDay)
        done()
    }
    func done()  {
        //------ for tomorrow ------
        // month end day 31
        if (dateComponents.day! == 30){
            if(dateComponents.month! == 1 || dateComponents.month! == 4 || dateComponents.month! == 6 || dateComponents.month! == 7 || dateComponents.month! == 9 || dateComponents.month! == 11 ){
                TimeTomorrow.append("\(dateComponents.month!+1)")
            }
        // month end day 31
        }else if (dateComponents.day! == 31){
            if(dateComponents.month! == 3 || dateComponents.month! == 5 || dateComponents.month! == 8 ){
                TimeTomorrow.append("\(dateComponents.month!+1)")
            }else if(dateComponents.month! == 12){
                TimeTomorrow.append("\(dateComponents.year!+1)")
            }
         // month end day 29
        // special case for leap year i donot know how find it
        //****************************************************
            else if (dateComponents.day! == 29){
                if(dateComponents.month! == 2 || dateComponents.month! == 10  ){
                    TimeTomorrow.append("\(dateComponents.month!+1)")
                }
            }
        //------ for yesterday  ------
            if (dateComponents.month! == 12 || dateComponents.month! == 10 || dateComponents.month! == 8 || dateComponents.month! == 7 || dateComponents.month! == 5 || dateComponents.month! == 2){
                var day = dateComponents.date! - 1
                //fatal error: unexpectedly found nil while unwrapping an Optional value
                TimeYesterday.append("\(day)")
                TimeYesterday.append("30 - \(dateComponents.month! - 1)")
            }else {
                //////
            }
        }
    }
}
17
joshua

Vous devez utiliser la méthode de calendrier date(byAdding component:) pour effectuer vos calculs de calendrier en utilisant l'heure de midi. Ce faisant, vous n'avez pas à vous soucier de ces cas particuliers:

Swift 3 ou plus tard

extension Date {
    static var yesterday: Date {
        return Calendar.current.date(byAdding: .day, value: -1, to: Date().noon)!
    }
    static var tomorrow: Date {
        return Calendar.current.date(byAdding: .day, value: 1, to: Date().noon)!
    }
    var dayBefore: Date {
        return Calendar.current.date(byAdding: .day, value: -1, to: noon)!
    }
    var dayAfter: Date {
        return Calendar.current.date(byAdding: .day, value: 1, to: noon)!
    }
    var noon: Date {
        return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
    var month: Int {
        return Calendar.current.component(.month,  from: self)
    }
    var isLastDayOfMonth: Bool {
        return dayAfter.month != month
    }
}

Date.yesterday    // "Oct 28, 2018 at 12:00 PM"
Date()            // "Oct 29, 2018 at 11:01 AM"
Date.tomorrow     // "Oct 30, 2018 at 12:00 PM"

Date.tomorrow.month   // 10
Date().isLastDayOfMonth  // false
82
Leo Dabus

Je ne sais pas si cela vous aide ou non, mais je recommanderais de ne pas faire le calcul le NSDateComponents mais plutôt le NSDate. Jetez un oeil à https://github.com/malcommac/SwiftDate un cocoapod pour savoir comment faire des choses comme appeler tomorrow sur un NSDate. La bonne chose à propos de ce module est qu’il utilise Regions, ce qui facilite l’internationalisation, le lendemain pouvant commencer au coucher du soleil au lieu de mi-nuit.

1
Vader