在我的应用中,我必须设置每周提醒,以便在一周后的同一天/时间发出提醒。我一直在使用NSDateComponenents.week = 1并使用NSCalendar的dateByAddingComponents:toDate:options:
API将其添加到NSDate。看来week
现在在iOS7中被弃用,警告告诉我"使用weekOfMonth或weekOfYear,具体取决于你的意思"。但我无法找到关于其中任何一个含义的文档。
谁能解释两者之间的区别?在基本测试中,两者在添加到NSDate时返回相同的值,但我确定两者之间存在一些有意义的差异。
答案 0 :(得分:6)
两个节目之间的差异显示相对于月份或年份的周。
2月的第二周(weekOfMonth)将是一年中的第七周(weekOfYear),例如,取决于年份。
至于使用日期组件将日期添加到某个日期,它似乎并不重要,但在互联网上似乎首选的是weekOfYear。
我在Swift游乐场做了一些测试,他们总是在为某个日期添加周数时计算相同的值。
答案 1 :(得分:4)
我总是发现在iOS中似乎很奇怪地处理了几周。
weekOfMonth
将是1,2,3,4等......
weekOfYear
将是1到52(我认为)
他们似乎不是持续时间的衡量标准。就像4月3日'不是持续时间的衡量标准,而是" 1天"是持续时间的衡量标准。
添加一周的最佳方式是......
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:7];
NSDate *date = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
修改强>
经过一点点测试后我才对。NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:NSCalendarUnitWeekOfMonth | NSCalendarUnitWeekOfYear fromDate:date];
Printing description of date:
2014-08-20 08:15:13 +0000
Printing description of comps:
<NSDateComponents: 0xb7753c0>
Week of Year: 34
Week of Month: 4
答案 2 :(得分:2)
例如,如果您想将事件设置为始终发生在“当月的第二个星期二”,则差异非常有用。
在这种情况下,你希望weekOfMonth为2。
答案 3 :(得分:0)
我正在使用DateComponents
来显示重复发生的事件(例如,每30天,每3周,每2个月)。我写了一个扩展名:
extension DateComponents {
var frequencyString: String? {
let formatter = DateComponentsFormatter()
if let value = self.day, value != 0 {
formatter.allowedUnits = [.day]
} else if let value = self.weekOfYear, value != 0 {
formatter.allowedUnits = [.weekOfYear]
} else if let value = self.month, value != 0 {
formatter.allowedUnits = [.month]
} else {
formatter.allowedUnits = [.day, .weekOfMonth, .month]
}
formatter.unitsStyle = .full
formatter.maximumUnitCount = 1
return formatter.string(from: self)
}
}
然后在Playground我这样做了:
var dateComponents = DateComponents()
dateComponents.weekOfYear = 100
dateComponents.calendar = .current
令人惊讶的是,对于.weekOfYear
,frequencyString
返回了nil
。当我将所有.weekOfYear
更改为扩展程序中的.weekOfMonth
时,它返回了正确的周数值(获取weekOfMonth
时)。