5

一年有几个星期?因为我在网上搜索过,发现一年总共有 52.1 周,但如果我在 Xcode 中这样做:

NSCalendar *gregorian = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSGregorianCalendar];

[gregorian setFirstWeekday:2];

NSDate* sourceDate = [NSDate date];

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* today = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

NSDateComponents *todaysComponents = [gregorian components:NSWeekCalendarUnit fromDate:today];

NSUInteger todaysWeek = [todaysComponents week];

todaysWeek 值为:53,这怎么可能?为什么不是52?

4

2 回答 2

1

他们将 52.1 转换为 53... 显示比截断小数部分更好。

这也取决于一周的开始日期。

欧洲和 ISO 标准(从周一到周日)——总共 52 周,短周(1 天)占 1 月 1 日星期日,短周(1 天)占 12 月 31 日星期一54 周。

美国标准(从周日到周六)- 52 整周,以及 12 月 30 日和 31 日的短(2 天)周,总共 53 周。

从周六到周五——51 个整周,一个短周(6 天)从 1 月 1 日到 1 月 6 日,一个短周(3 天)从 12 月 29 日到 12 月 31 日,总共 53 周。

编辑:

由于 iOS NSCalender 似乎将 ISO 8601 定义为默认值。您需要使用“setMinimumDaysInFirstWeek”方法设置日历以获得预期的周数结果。

请添加此代码并检查

    [gregorian setMinimumDaysInFirstWeek:5]; //"5" means Thursday in this case.

http://en.wikipedia.org/wiki/ISO_week_date “一年的第一周是包含一年中第一个星期四的那一周。”

编辑2:

用于检查一年中可能的最小/最大周数

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
int minWeeks, maxWeek;
minWeeks=maxWeek=0;
for (int weekCounter=1; weekCounter<=7; weekCounter++) {
    [gregorian setMinimumDaysInFirstWeek:weekCounter];
    [gregorian setFirstWeekday:2];
    NSDate* sourceDate = [NSDate date];
    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
    NSDate* today = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
    NSDateComponents *todaysComponents = [gregorian components:NSWeekCalendarUnit fromDate:today];
    NSUInteger todaysWeek = [todaysComponents week];

    if (todaysWeek>maxWeek) {
        maxWeek=todaysWeek;
    }
    if (todaysWeek<minWeeks || minWeeks==0) {
        minWeeks=todaysWeek;
    }
}
NSLog(@"min:%d, max:%d", minWeeks, maxWeek);
于 2012-12-24T09:03:52.980 回答
0

您可以尝试以下代码吗?

NSDate *date = [NSDate date];
NSDateFormatter *weekFormatter = [[NSDateFormatter alloc] init];
[weekFormatter setDateFormat:@"w"];
NSString *weekDateString = [weekFormatter stringFromDate:date];
NSLog(@"week = %@",weekDateString);
[weekFormatter release];

您可以使用上面的代码获取一年中的周数。但该数字基于当前的日历和区域设置。

于 2012-12-24T09:05:09.510 回答