NSDate returns an invalid week.

I have the following code:

getWeek(addDays(Date, amount: 6))

func addDays(date: NSDate, amount: Int) -> NSDate {
    // calculation $additionalDays
    let additionalDays = amount
    // adding $additionalDays
    let components = NSDateComponents()
    components.day = additionalDays

    // important: NSCalendarOptions(0)
     let futureDate = NSCalendar.currentCalendar()
    .dateByAddingComponents(components, toDate: date, options: NSCalendarOptions(rawValue: 0))
    return futureDate!
}

func getWeek(today:NSDate)->Int? {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    let myComponents = myCalendar.components(.WeekOfYear, fromDate: today)
    let weekNumber = myComponents.weekOfYear
   return weekNumber
}

Date in getWeek(addDays(Date, amount: 6))returns dec 27, 2015, 7:16PM This is correct (next Sunday) However, if I try to return the week number for this date, it returns 1, then it should be 53. How can I get the correct week number?

+4
source share
4 answers

According to Apple Developer Technical Support :

December 27, 2015 is week 52, not week 53. The first day of week 53 in 2015 is December 28.

, , , getWeek(), ISO 8601. , NSCalendarIdentifierGregorian, NSCalendarIdentifierISO8601. /lots/ . gory, , " - , , 8601, NSCalendarIdentifierISO8601.

getWeek() , ISO 8601. :

print(self.getWeek(self.dateFromFixedFormatString("2015-12-27 12:34")))
print(self.getWeek(self.dateFromFixedFormatString("2015-12-28 12:34")))

  • 52
  • 53

:

func dateFromFixedFormatString(dateStr: String) -> NSDate {
   let df = NSDateFormatter()
   df.locale = NSLocale(localeIdentifier: "en_US_POSIX")
   df.dateFormat = "yyyy-MM-dd HH:mm"
   return df.dateFromString(dateStr)!
}
func getWeek(today:NSDate) -> Int {
   let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)!
   let myComponents = myCalendar.components(.WeekOfYear, fromDate: today)
   let weekNumber = myComponents.weekOfYear
   return weekNumber
}

, , GregorianCalendar, , NSCalendarIdentifierISO8601 . NSCalendar.currentCalendar() ISO. ( )

+8

โ€‹โ€‹ Apple. , Apple , 27 2015 1 2016 . ISO 53, 31 . (A 31 1: https://en.wikipedia.org/wiki/ISO_week_date#Last_week).

, , , . , .YearForWeekOfYear, 2016 1 .

0

Please keep in mind that the ISO week and US numbering are different! If you look at the Wikipedia article mentioned above, read on to โ€œOther Numbering Systems per Weekโ€. Therefore, there must be a setting to control US and ISO weeks.

0
source

I made your program with minor corrections and changed the calendar to ISO. This provides the desired result for 2015, please check it in other years.

import Foundation

let now = NSDate()

func addDays(date: NSDate, amount: Int) -> NSDate {
    // calculation $additionalDays
    let additionalDays = amount
    // adding $additionalDays
    let components = NSDateComponents()
    components.day = additionalDays

    // important: NSCalendarOptions(0)
    let futureDate = NSCalendar.currentCalendar()
        .dateByAddingComponents(components, toDate: date, options: NSCalendarOptions(rawValue: 0))
    return futureDate!
}

func getWeek(today:NSDate)->Int {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)!
    let myComponents = myCalendar.components(.WeekOfYear, fromDate: today)
    let weekNumber = myComponents.weekOfYear
    return weekNumber
}

print(getWeek(addDays(now, amount: 6)))
0
source

Source: https://habr.com/ru/post/1621148/


All Articles