从一周的返回date不是在一周的date

我遇到了一个相当奇怪的“bug”。 使用此方法获取一年的一周的date时:

let dates = NSMutableArray() let cal = NSCalendar.currentCalendar() cal.firstWeekday = 2 let formatter = NSDateFormatter() formatter.dateFormat = "ww YYYY" formatter.calendar = cal let date = formatter.dateFromString(week as String) println(date) 

stringweek52 2014 ,所以预计date将是12月22日星期一,但它将返回星期六12月20日,在23:00。 首先,我想我已经设置了日历的第一个周日选项来处理每周的第一天,但​​没有运气。 此外,返回的date是不是在52周。

只是为了仔细检查我跑了cal.components(NSCalendarUnit.WeekOfYearCalendarUnit, fromDate: date!).weekOfYear仔细检查我不是一个白痴,没有先生,生产date的一周是51,所需的一周前一周。

任何想法如何能达到预期的结果?

将第一个星期从1改为2不会改变date,只会改变从星期天到星期一的第一个工作日。

你可以这样做:

 func dateFromWeekOfYear(year:Int, weekOfYear:Int, weekday:Int) -> NSDate { return NSCalendar.currentCalendar().dateWithEra(1, yearForWeekOfYear: year, weekOfYear: weekOfYear, weekday: weekday, hour: 0, minute: 0, second: 0, nanosecond: 0)! } let date1 = dateFromWeekOfYear(2014, 52, 1) // Dec 21, 2014, 12:00 AM let date2 = dateFromWeekOfYear(2014, 52, 2) // Dec 22, 2014, 12:00 AM let date3 = dateFromWeekOfYear(2014, 52, 3) // Dec 23, 2014, 12:00 AM 

如果处理一个string,你想设置他独立当地的星期几你可以这样做:

 let myDate = "2 52 2014" let cal = NSCalendar.currentCalendar() let formatter = NSDateFormatter() formatter.dateFormat = "c ww Y" formatter.calendar = cal if let date1 = formatter.dateFromString(myDate) { date1 // "Dec 22, 2014, 12:00 AM" } 

如果你需要进一步的参考,你可以使用这个:

在这里输入图像说明

任何想法如何能达到预期的结果?

什么是你想要的结果? 你想知道一周的第一天还是最后一天的第一天? 比你可以托盘:

 let now = NSDate() var startDate: NSDate? = nil var duration: NSTimeInterval = 0 let cal = NSCalendar.currentCalendar() cal.firstWeekday = 2 cal.rangeOfUnit(.WeekCalendarUnit, startDate: &startDate, interval: &duration, forDate: now); let endDate = startDate?.dateByAddingTimeInterval(duration) print(startDate) print(endDate) 

它打印

 "Optional(2014-12-21 23:00:00 +0000)" "Optional(2014-12-28 23:00:00 +0000)" 

结束date是不再是一周中的第一秒钟。

请注意,1小时的偏移量是由UTC时间打印的,实际上是GMT的冬天时间。 确实这些date是2014-12-22 00:00:002014-12-29 00:00:00在我所在的时区(GMT + 1)


或干脆

 let components = NSDateComponents() components.weekOfYear = 52 components.weekday = 2 components.year = 2014 let cal = NSCalendar.currentCalendar() let day = cal.dateFromComponents(components) 

此代码适合尊重用户的日历:

 let cal = NSCalendar.currentCalendar() let components = NSDateComponents() components.weekOfYear = 52 components.weekday = cal.firstWeekday components.year = 2014