2016-09-03 14 views
2

次の時間の時間を探したいと思います。 など。今SwiftのCalendar nextDateメソッドを使用して次の時間の時間を見つける方法

です:4/9/16、10時12分34秒AM GMT + 10 私が取得したい:4/9/16を、11時00分○○秒AM GMT + 10

だから私は試してみましたCalendar.current.nextDateを使用していますが、私は奇妙な応答を得ました。 サンプルコードは次のとおりです。

let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .short 
    dateFormatter.timeStyle = .long 

    var dateComponents = DateComponents() 
    dateComponents.minute = 0 
    dateComponents.second = 0 

    let beginDate = Date(timeIntervalSince1970: 0) 
    var beginDateComponents = Calendar.current.dateComponents(in: TimeZone.current, from: beginDate) 
    beginDateComponents.minute = 0 
    beginDateComponents.second = 0 
    let modifiedDate = Calendar.current.date(from: beginDateComponents)! 

    let nextHourlyTime = Calendar.current.nextDate(after: modifiedDate, matching: dateComponents, matchingPolicy: .nextTime)! 

    print("modifiedDate: \(dateFormatter.string(from: modifiedDate))") 
    print("beginDate: \(dateFormatter.string(from: beginDate))") 
    print("nextHourlyTime: \(dateFormatter.string(from: nextHourlyTime))") 

    /* 
    modifiedDate: 1/1/70, 10:00:00 AM GMT+10 
    beginDate: 1/1/70, 10:00:00 AM GMT+10 
    nextHourlyTime: 1/2/70, 12:00:00 AM GMT+10 
    */ 

しかし、私は、コードコメントを入力した場合:「dateComponents.second = 0」を、私は正しい答えを得るでしょう。

AppleのnextDate APIに問題がありますか?

答えて

5

エラーはあなたのbeginDateにあります。 Date()ではなく、Date(timeIntervalSince1970: 0)に設定する必要があります。あなたは次のようにそれを行うことができます:

extension Date { 
    var nextHourShift: Date? { 
     return Calendar.current.nextDate(after: self, matching: DateComponents(minute: 0), matchingPolicy: .nextTime) 
    } 
} 

Date().nextHourShift // "Sep 3, 2016, 4:00 AM" 
+0

ニースの優雅なコード。それは正しく行います。 Gregorian.calendar.nextDate(後に:self、matching:DateComponents(分:0、秒:0)、matchingPolicy:.nextTime) "が正しく動作しない理由を理解できません" – allenlinli

+1

美しく簡単です...結果を投稿したときにあなたが東海岸にいたと言うことができると思います。 ;-) – BonanzaDriver

+1

ありがとうございます。私は 'Calendar.current.date(Calendar.current.dateComponents([。year、.month、.day、.hour]、from:Date())')に 'Calendar.current.dateを使ってみました。それはうまくいかないでしょう。 – Stefan

関連する問題