2015-03-06 3 views

ответ

9

Что-то, как это должно работать:

let cal = NSCalendar.currentCalendar() 

let components = NSDateComponents() 
components.weekOfYear -= 1 

if let date = cal.dateByAddingComponents(components, toDate: NSDate(), options: NSCalendarOptions(0)) { 
    var beginningOfWeek: NSDate? 
    var weekDuration = NSTimeInterval() 
    if cal.rangeOfUnit(.CalendarUnitWeekOfYear, startDate: &beginningOfWeek, interval: &weekDuration, forDate: date) { 
     let endOfWeek = beginningOfWeek?.dateByAddingTimeInterval(weekDuration) 
     print(beginningOfWeek) // Optional(2015-02-15 05:00:00 +0000) 
     print(endOfWeek) // Optional(2015-02-22 05:00:00 +0000) 
    } 
} 
+0

Благодарим за код. –

+0

'weekOfYear' -1 будет иметь проблемы в первую неделю года. – Estel

5

Более простой Swift 2 альтернативы в качестве расширения, полученного из Martin R's answer for getting the end of the month:

extension: NSDate { 
    func startOfWeek(weekday: Int?) -> NSDate? { 
     guard 
      let cal: NSCalendar = NSCalendar.currentCalendar(), 
      let comp: NSDateComponents = cal.components([.YearForWeekOfYear, .WeekOfYear], fromDate: self) else { return nil } 
     comp.to12pm() 
     cal.firstWeekday = weekday ?? 1 
     return cal.dateFromComponents(comp)! 
    } 

    func endOfWeek(weekday: Int) -> NSDate? { 
     guard 
      let cal: NSCalendar = NSCalendar.currentCalendar(), 
      let comp: NSDateComponents = cal.components([.WeekOfYear], fromDate: self) else { return nil } 
     comp.weekOfYear = 1 
     comp.day -= 1 
     comp.to12pm() 
     return cal.dateByAddingComponents(comp, toDate: self.startOfWeek(weekday)!, options: [])! 
    } 
} 

Использование:

// Use 2 for Monday, 1 for Sunday: 
print(NSDate().startOfWeek(1)!) // "2016-01-24 08:00:00 +0000\n" 
print(NSDate().endOfWeek(1)!) // "2016-01-30 08:00:00 +0000\n" 

Чтобы защититься от летнего времени и таким образом, вы должны также осуществлять расширение, чтобы заставить время до 12 часов:

internal extension NSDateComponents { 
    func to12pm() { 
     self.hour = 12 
     self.minute = 0 
     self.second = 0 
    } 
} 
4

Если кто-то ищут быстрый ответ 3:

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

func endOfWeek(weekday: Int) -> Date { 
    let cal = Calendar.current 
    var component = DateComponents() 
    component.weekOfYear = 1 
    component.day = -1 
    component.to12pm() 
    return cal.date(byAdding: component, to: startOfWeek(weekday: weekday))! 
} 

Я установлен в 00:00: 00 того дня

internal extension DateComponents { 
    mutating func to12am() { 
     self.hour = 0 
     self.minute = 0 
     self.second = 0 
    } 

    mutating func to12pm(){ 
     self.hour = 23 
     self.minute = 59 
     self.second = 59 
    } 
} 
+0

Не следует ли в endOfWeek включать 'component.second = 86399'? – MarksCode

+0

Да. Я изменил ответ, чтобы установить время до конца дня 23:59:59 –

+0

Удивительный! Можете ли вы помочь мне разобраться в форматировании, так что это «16 апреля - 23 апреля»? И тогда это не Sun-Sat, а Mon-Sun (возможно, я могу взломать это, просто добавив «+1» к каждому, но задаваясь вопросом, был ли лучший способ)? – jammyman34

Смежные вопросы