从返回日期的一周开始的日期不是一周

时间:2014-12-26 00:08:13

标签: ios date swift dayofweek

我遇到了一个相当奇怪的“虫子”。使用此方法获取一年中一周的日期时:

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)

字符串week52 2014,因此预计日期为12月22日星期一,而是返回12月20日星期六23:00。首先,我以为我通过设置日历的firstWeekday选项来处理一周的第一天,但​​没有运气。此外,返回的日期甚至不在第52周。

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

知道如何达到预期效果吗?

2 个答案:

答案 0 :(得分:1)

  

知道如何达到预期效果吗?

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

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)"

endDate是第一个不在本周的秒。

请注意,1小时的偏移是因为它以UTC时间打印,实际上是GMT冬季时间。实际上,我的时区(GMT + 1)中的这些日期为2014-12-22 00:00:002014-12-29 00:00:00


或只是

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

答案 1 :(得分:0)

将firstWeekday从1更改为2将不会更改日期,它将从星期日到星期一更改第一个工作日。

你可以这样做:

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

如果处理一个字符串并且你想在一周中的某一天设置他独立,你就可以这样做:

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"
}

如果您需要进一步参考,可以使用:

enter image description here