2017-05-16 12 views
11

Pracuję nad kalendarzem danych dla każdego bieżącego miesiąca i powinienem pokazać 3 rodzaje obliczeń dla (wczoraj - dzisiaj - jutro)swift 3 jak uzyskać datę na jutro i wczoraj (zajmij się specjalnym przypadkiem) nowy miesiąc lub nowy rok

mam awarię powodu (wskaźnik poza granicę) dla szczególnego przypadku jak gdyby data dzisiaj (31 maja 2017) i mam tablicę maja miesiąca, jeśli staram się kontynuować moją aplikację i rozpocząć jutro obliczeń będę Mam błąd [ponieważ powinienem znać jego nowy miesiąc jutro]

to jest mój kod

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 { 
       ////// 
      } 
     } 
    } 
} 
+0

Swift 3 Kod http: // stackoverflow.com/a/27048988/1187415. –

Odpowiedz

36

należy użyć metody Kalendarz date(byAdding component:) robić swoje calendrical obliczenia i robi więc nie trzeba się martwić o tych szczególnych przypadkach:

extension Date { 
    var yesterday: Date { 
     return Calendar.current.date(byAdding: .day, value: -1, to: noon)! 
    } 
    var tomorrow: 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 tomorrow.month != month 
    } 
} 

Date().yesterday // "Oct 28, 2017 at 12:00 PM" 
Date()    // "Oct 29, 2017 at 12:54 PM" 
Date().tomorrow // "Oct 30, 2017 at 12:00 PM" 

Date().yesterday.month // 10 
Date().isLastDayOfMonth // false 
+0

Data(). Wczoraj.month // Błąd, jak mogę wydrukować numer miesiąca na następny miesiąc –

+0

Skąd pochodzi miesiąc? –

+0

Możesz także przedłużyć Data, aby uzyskać komponent miesiąca z dowolnej daty, ale to inne pytanie –

0

Nie wiem, czy to ci pomaga, czy nie, ale nie polecam matematyki na NSDateComponents, ale raczej na NSDate. Spójrz na https://github.com/malcommac/SwiftDate cocoapod, aby dowiedzieć się, jak robić takie rzeczy, jak wywoływanie tomorrow na NSDate. Fajną rzeczą w tej kapsule jest to, że używa ona Regions, która pomaga w internacjonalizacji, gdzie następny dzień może rozpocząć się o zachodzie słońca zamiast w środku nocy.

Powiązane problemy