2017-04-17 119 views
4

的第一天,我已经写了一个Date扩展返回一周的第一天给定日期(星期一计数为第一天)。但是,它在一个星期一过早返回。这里是我的代码:周日期延长

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

应将日历计算添加到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 

而且,你的要求是不完全清楚。在欧洲,星期一是本周的第一天。在北美,这是星期天。答案假定你总是想要星期一。