NSDateComponents:weekOfYear和weekOfMonth之间的差异

时间:2014-08-20 07:39:37

标签: objective-c cocoa cocoa-touch nsdate nsdatecomponents

在我的应用中,我必须设置每周提醒,以便在一周后的同一天/时间发出提醒。我一直在使用NSDateComponenents.week = 1并使用NSCalendar的dateByAddingComponents:toDate:options: API将其添加到NSDate。看来week现在在iOS7中被弃用,警告告诉我"使用weekOfMonth或weekOfYear,具体取决于你的意思"。但我无法找到关于其中任何一个含义的文档。

谁能解释两者之间的区别?在基本测试中,两者在添加到NSDate时返回相同的值,但我确定两者之间存在一些有意义的差异。

4 个答案:

答案 0 :(得分:6)

两个节目之间的差异显示相对于月份或年份的周。

2月的第二周(weekOfMonth)将是一年中的第七周(weekOfYear),例如,取决于年份。

至于使用日期组件将日期添加到某个日期,它似乎并不重要,但在互联网上似乎首选的是weekOfYear。

我在Swift游乐场做了一些测试,他们总是在为某个日期添加周数时计算相同的值。

weekOfMonth vs weekOfYear

答案 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

令人惊讶的是,对于.weekOfYearfrequencyString返回了nil。当我将所有.weekOfYear更改为扩展程序中的.weekOfMonth时,它返回了正确的周数值(获取weekOfMonth时)。