2017-04-17 14 views
4

私は指定された日付の最初の曜日を返すDate拡張を書いています(最初の日として月曜日が数えます)。しかし、それは早すぎる1月曜日を返すことを続けます。ここに私のコードは次のとおりです。週の最初の曜日日付の延長

extension Date { 
    func startOfWeek() -> Date { 
     var cal = Calendar.current 
     var component = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self) 
     cal.firstWeekday = 2 
     return cal.date(from: component)! 
    } 
} 

だから私はそれを次の日付を与えるとき:

let sampleDate = "2017-06-15 02:50:09 +0000" 

let formatter = DateFormatter() 
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" 
    if let date = formatter.date(from: sampleDate) { 
     print(date.startOfWeek()) 
    } 
} 

2017-06-05 07:00:00 +0000をプリントアウトします。

誰かが私のコードが1週間​​早すぎる日付を返す理由を理解できますか?

答えて

1

Calendarオブジェクトに天気計算を追加する必要があります(startOfDay(for:)のように)。あなたはそれDateの拡張作りを主張した場合、あなたは以下のコードに適応することができます。また

extension Calendar { 
    func startOfWeek(for date: Date) -> Date { 
     if self.component(.weekday, from: date) == 2 { 
      return self.startOfDay(for: date) 
     } else { 
      let components = DateComponents(calendar: self, weekday: 2) 
      return self.nextDate(after: date, matching: components, matchingPolicy: .nextTime, direction: .backward)! 
     } 
    } 
} 

// Test: 2017-06-15 02:50:09 in your **local time** 
let date = DateComponents(calendar: .current, year: 2017, month: 6, day: 15, hour: 2, minute: 50, second: 9).date! 

// My timezone is EDT 
print(Calendar.current.startOfWeek(for: date)) // 2017-06-12 04:00:00 +0000 

を、あなたの条件は必ずしも明らかではありません。ヨーロッパでは、月曜日が週の最初の日です。北米では、それは日曜日です。答えはあなたが月曜日をいつも望んでいると仮定しました。

関連する問題