8

在我的机器上(美国地区设置),默认的“短”日期格式设置为“1/5/13”(月/日/年)。

在“系统偏好设置”中,我附加了一个星期编号“1/5/13 1”。

我的问题是这段代码,我尝试将字符串转换为日期:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"];
NSLog(@"Date: %@", date);

在我的机器上,打印:

Date: 2000-01-01 05:00:00 +0000

那是2000,甚至不接近2013

是什么导致了这个问题?

4

3 回答 3

9

我迟到了这个讨论,并且已经看到了许多提供的解决方案,但我认为它们都有问题的是两个不兼容的日期格式元素正在一起使用。您最初的方法失败了,因为您尝试从中获取日期的字符串与提供的字符串不匹配NSDateFormatterShortStyle

如果你要评估一年中的哪一周,那么你必须使用大写的年份;这提供了“一年中的一周”类型的日历。

让我们重新处理您的原始代码以包含新格式:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/YY w"];
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"];
NSLog(@"Date: %@", date);

请注意,我今年使用的是大写形式。一年中的一周为 1,我得到这个:

Date: 2013-01-05 08:00:00 +0000

一年中的一周有 2 个:

Date: 2013-01-12 08:00:00 +0000

和3:

Date: 2013-01-19 08:00:00 +0000

有道理,不是吗?日期中的日期增加 7 天,每次增加一年中的一周。当然,时间已经过去了,但我们从未讨论过在该领域进行评估的任何事情,不是吗?

于 2013-08-20T05:06:20.550 回答
2
NSDateComponents *cmp=[[[NSDateComponents alloc]init]autorelease];
[cmp setWeek:1];
NSCalendar *cal=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSDate *dte=[NSDate date];
NSDate *weekDate=[cal dateByAddingComponents:cmp toDate:dte options:0];
[dateFormatter setDateFormat:@"MM/dd/YY"];
NSString *strDate=[dateFormatter stringFromDate:weekDate];
NSLog(@"Date: %@", strDate);
于 2013-08-20T08:31:23.443 回答
-1

您需要使用...dateFromString的方法NSDateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"mm/dd/yyyy"];
NSDate *myDate = [dateFormatter dateFromString:@"1/5/2013"];
NSLog(@"Date: %@", myDate);

如果您想使用周数NSCalendarNSDateComponents请根据您的需要使用...(请参阅此代码片段)

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:date];
NSInteger week = [components week];

我希望这有帮助。

于 2013-08-12T18:51:19.907 回答