it-swarm.com.de

swift 3 wie man datum für morgen und gestern bekommt (besonderen fall beachten), neuer monat oder neues jahr

Ich arbeite für jeden aktuellen Monat am Datenkalender Ich sollte 3 Berechnungsarten für (gestern - heute - morgen) anzeigen.

Ich bin wegen (Index außerhalb der Grenzen) für den Sonderfall Wie das heutige Datum (31. Mai 2017) Abgestürzt. Ich habe ein Array von Mai-Monat, wenn ich versuche, meine App fortzusetzen und morgen mit der Berechnung zu beginnen habe Fehler (da sollte ich morgen den neuen Monat wissen)

Das ist mein 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

Verwenden Sie die Kalendermethode date(byAdding component:), um Ihre Kalenderberechnungen mit der Mittagszeit durchzuführen. Dadurch müssen Sie sich nicht um diese speziellen Fälle kümmern:

Swift 3 oder später

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

Ich weiß nicht, ob dies Ihnen hilft oder nicht, aber ich würde empfehlen, die Mathematik nicht auf NSDateComponents, sondern eher auf NSDate auszuführen. Werfen Sie einen Blick auf https://github.com/malcommac/SwiftDate a cocoapod, um zu erfahren, wie Sie tomorrow auf einem NSDate aufrufen können. Das Coole an diesem Pod ist, dass er Regions verwendet. Dies hilft bei der Internationalisierung, wo der nächste Tag bei Sonnenuntergang beginnen kann, statt mittags.

1
Vader