2017-05-16 5 views
11

私は現在の月のデータカレンダーで作業しています と私は計算の3タイプを表示する必要があります(昨日 - 今日 - 明日)swift 3明日と昨日の日付を取得する方法(特別な場合に注意してください)新しい月または新年

ため、私は特別なケース のためのバウンドのうち(インデックス)のクラッシュを持っているように、今日の日付(2017年5月31日) と私は私のアプリを続けると私は意志計算明日を起動しようとする場合、私は月の月の配列を持っている場合エラー[私は明日の新月を知るはずだから]

これは私のコードです

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

スウィフト3コード:// stackoverflow.com/a/27048988/1187415 –

答えて

36

あなたはとてもあなたがそれらの特殊なケースを心配する必要はありませんあなたの暦計算を行うためにカレンダー法date(byAdding component:)を使用して行う必要があります:http中

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

Date()。yesterday.month //次の月の月の数字を印刷するにはどうすればいいですか –

+0

月はどこから来ますか? –

+0

日付を延長して任意の日付から月の構成要素を取得することもできますが、別の質問があります –

0

これはあなたに役立つかどうかわかりませんが、NSDateComponentsではなくNSDateで数式を実行しないことをお勧めします。 NSDateでtomorrowと呼ぶようにする方法については、https://github.com/malcommac/SwiftDateココアポッドを見てください。そのポッドについてのクールなことは、Regionsを使用することです。国際化に役立ち、翌々日は中期の夕方の代わりに日没で始まるかもしれません。

関連する問題