2017-12-02 14 views
1

私は毎月1日をカウントし、その特定の日に達した翌月に自分自身をリセットするカウンタを作ろうとしています。毎月1日をカウントダウン

はここに私のコードです:

let date = NSDate() 
    let calendar = Calendar.current 

    let currentDate = calendar.date(from: components) 

    let userCalendar = Calendar.current 

    // here we set the due date. When the timer is supposed to finish 
    let competitionDate = NSDateComponents() 

    competitionDate.year = components.year! 
    competitionDate.month = components.month! 

    competitionDate.day = 9 
    competitionDate.hour = 00 
    competitionDate.minute = 00 
    let competitionDay = userCalendar.date(from: competitionDate as DateComponents)! 

    //here we change the seconds to hours,minutes and days 
    let CompetitionDayDifference = calendar.dateComponents([.day, .hour, .minute], from: Date().startOfMonth(), to: competitionDay) 

    //finally, here we set the variable to our remaining time 
    let daysLeft = CompetitionDayDifference.day 
    let hoursLeft = CompetitionDayDifference.hour 
    let minutesLeft = CompetitionDayDifference.minute 

    print(daysLef) 
    counter.value = CGFloat(daysLeft!) 

このコードの問題は、それが0日目に到達するとき、それは一日#9

あなたが使用する必要があります
+0

あなたがしようとしている場合は、何を試しましたか? – Rog

答えて

1

次の月に、現在の日付からカウントするために戻って自己それをリセットしたことがありませんCalendarメソッドfunc nextDate(after date: Date, matching components: DateComponents, matchingPolicy: Calendar.MatchingPolicy, repeatedTimePolicy: Calendar.RepeatedTimePolicy = default, direction: Calendar.SearchDirection = default) -> Date?を使用して、日付コンポーネントを渡し、matchingPolicy .strict、repeatedTimePolicy .firstおよび方向.forwardを使用して、次の日付のオカレンスを検索します。次に、あなただけのカレンダー法func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponentsを使用して、必要なコンポーネントが(日、時、分)返された日付を渡す必要があります:

extension Date { 
    func timeLeftUntil(day: Int) -> (day: Int, hour: Int, minute: Int) { 
     precondition(1...28 ~= day, "paycheck day \(day) is out of range 1...28") 
     let nextDate = Calendar.current.nextDate(after: self, matching: DateComponents(day: day), matchingPolicy: .strict, repeatedTimePolicy: .first, direction: .forward)! 
     let dateComponents = Calendar.current.dateComponents([.day,.hour,.minute], from: self, to: nextDate) 
     return (dateComponents.day!, dateComponents.hour!, dateComponents.minute!) 
    } 
} 

使用法:

Date().timeLeftUntil(day: 25) // (day 23, hour 0, minute 39) 
+1

たくさんありがとうございます – ASH

+0

あなたは大歓迎です –

+0

こんにちは、あなたのコードは完璧に動作していますが、今年の問題に直面しています。たとえば、私のカレンダーを12月に変更するとtimeLeftUntil(day:10)と言うと、私のアプリはフリーズしますが、2018に日付を変更するとそれはうまくいきます。助言がありますか? – ASH

関連する問題