0

下面的代码在传递year和时计算给定周的前一周数week

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:year];
[components setWeek:NSWeekCalendarUnit];
[components setWeekOfYear:(week-1)]; //Get the previous week
[components setWeekday:2]; //Monday
[components setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [calendar dateFromComponents:components];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyww"];
NSString *newRevision = [formatter stringFromDate:date];

我很惊讶它处理了像 201101 (给出 201052)这样的案例,但它不能正确处理有 53 周的年份。例如,对于 201601,它返回 201552 而不是 201153。(至少根据http://en.wikipedia.org/wiki/ISO_week_date它应该返回 201153。 )

难道我做错了什么?我已经跟踪以确保输入正确。

4

3 回答 3

2

您已NSGregorianCalendar为您的日历选择。尝试使用NSISO8601Calendar

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSISO8601Calendar];
于 2012-01-03T18:16:15.420 回答
1

我们最终通过一些技巧解决了这个问题。从问题中的维基百科链接,我们得到了所有年份的列表,其中包含接下来 400 年的 53 周,并将它们硬编码(包括明智的评论和“正确”的解决方案)。

if (week == 1)
{
    year = year - 1;
    week = 52;
    if (year == 2004 || year == 2009 || year == 2015 || year == 2020 || year == 2026 || year == 2032 || year == 2037 || year == 2043 || year == 2048 || year == 2054 || year == 2060 || year == 2065 || year == 2071 || year == 2076 || year == 2082 || year == 2088 || year == 2093 || year == 2099 || year == 2105 || year == 2111 || year == 2116 || year == 2122 || year == 2128 || year == 2133 || year == 2139 || year == 2144 || year == 2150 || year == 2156 || year == 2161 || year == 2167 || year == 2172 || year == 2178 || year == 2184 || year == 2189 || year == 2195 || year == 2201 || year == 2207 || year == 2212 || year == 2218 || year == 2224 || year == 2229 || year == 2235 || year == 2240 || year == 2246 || year == 2252 || year == 2257 || year == 2263 || year == 2268 || year == 2274 || year == 2280 || year == 2285 || year == 2291 || year == 2296 || year == 2303 || year == 2308 || year == 2314 || year == 2320 || year == 2325 || year == 2331 || year == 2336 || year == 2342 || year == 2348 || year == 2353 || year == 2359 || year == 2364 || year == 2370 || year == 2376 || year == 2381 || year == 2387 || year == 2392 || year == 2398)
    {
        week = 53;
    }
}
else
{
    week = week-1;
}

这并不理想,但它会在 Apple 实施 ISO 8601 或直到 2404 年之前完成这项工作。

于 2012-01-05T15:00:26.310 回答
0

对于 2016 年 1 月 1 日的案例,您应该得到:

  • 周 = 53
  • 年份 = 2015

当您打印答案时,请使用“YYYY”而不是“yyyy”。

  • YYYY - 给你一周中的年份
  • yyyy - 给你日期的年份
于 2016-01-14T17:47:02.313 回答