1

我正在尝试确定今年一周的日期。这是我的代码,也是正在计算的运行时值:

在此处输入图像描述

为什么年份不正确?也尝试了其他格式,比如 yw 并且都给了我相同的结果。如果我使用 YYYY-w 但我会得到错误的月份/日期,这个问题会自行解决,因为年份的计算方式不同。仅供参考,这就是我从 YYYY 得到的信息:

在此处输入图像描述

现在日期 04-29 是“yyyy”情况下第 18 周的正确日期(请参见此处:http ://www.epochconverter.com/date-and-time/weeknumbers-by-year.php ),但年份是仅在使用“YYYY”时才正确(那么日期是错误的)。

那是怎么回事?

-------- 更新 1 ---------

添加答案之一中提供的解决方案后:

在此处输入图像描述

-------- 更新 2 ----------

所以我的日期 2000 与“未定义年份”的值相同(以前是 1970 年)。见这里: http: //openradar.appspot.com/12358210

-------- 更新 3 ----------

系统信息(对于那些将尝试复制此信息的人)。

XCode:版本 4.6.2 (4H1003) iOS:6.1 OSX:10.8.3

-------- 更新 4 ----------

iOS 5.1 在使用这个时会提供不同的结果:

在此处输入图像描述

好像 iOS 5.1 不支持 NSDateFormatter 中的“w”。

4

3 回答 3

3

编辑 1:这个答案没有解释 OP 看到的结果。有关更多信息,请参阅评论讨论

编辑 2:我的机器上的结果非常奇特。在 iOS 6 上,week 根本不考虑first day of week设置System Preferences

iOS 6 总是返回:

2000-1 -> 2000 年 1 月 1 日(星期六)

2001-1 -> 2001 年 1 月 6 日(星期六)

即使我这样做[calendar setFirstWeekday: 3][dateFormatter setCalendar: calendar]也完全不会影响结果(与 iOS 5 不同)!这肯定是 iOS 6 NSCalendar API 中的一个错误。我建议您NSDateComponents自己使用或计算日期。给出这个答案中的信息应该很容易 - 您可以假设 ISO-8601(第一周至少 4 天,每周从星期一开始),当然,除非您可以询问用户的偏好。


原始答案


这是正在发生的事情:

在您的语言环境中,一周中的最少天数是5并且一周从星期六开始。

假设这是真的,您的第一周将是5th Jan(Sat) - 11th Jan 2013。你猜对了,第 18 周将是:4th May 2013.

为什么?因为 Apple 遵循Unicode Technical Standard #35 版本 tr35-25(在 iOS 6+ 上)。

F.4 Week of Year

Values calculated for the Week of Year field range from 1 to 53 for the Gregorian calendar   
(they may have different ranges for other calendars). Week 1 for a year is the first week 
that contains at least the specified minimum number of days from that year. Weeks between 
week 1 of one year and week 1 of the following year are numbered sequentially from 2 to 52 
or 53 (if needed). For example, January 1, 1998 was a Thursday. If the first day of the 
week is MONDAY and the minimum days in a week is 4 (these are the values reflecting ISO 
8601 and many national standards), then week 1 of 1998 starts on December 29, 1997, and 
ends on January 4, 1998. However, if the first day of the week is SUNDAY, then week 1 of 
1998 starts on January 4, 1998, and ends on January 10, 1998. The first three days of 1998 
are then part of week 53 of 1997.

此外,YYYY-w是正确的格式。


于 2013-05-03T09:10:19.140 回答
1

如果您使用的是 NSCalender,那么您将获得所有像这样的组件,

NSDate *date = [NSDate date];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit;
    NSDateComponents *components1 = [calendar components:units fromDate:date];
    NSInteger year = [components1 year];
    NSInteger week=[components1 weekOfYear];
于 2013-05-03T08:41:52.257 回答
0

你能试试这个吗

NSString *dateString = @"2013-18";

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-ww"];

NSDate *date = [dateFormatter dateFromString:dateString];
NSLog(@"Date: %@",date);
于 2013-05-03T08:20:34.850 回答