85

'YYYY' 和 'yyyy' 之间的确切区别是什么。我在这个链接中读到,它指出

一个常见的错误是使用 YYYY。yyyy 指定日历年,而 YYYY 指定年份(“一年中的一周”),用于 ISO 年-周日历。在大多数情况下,yyyy 和 YYYY 产生相同的数字,但它们可能不同。通常,您应该使用日历年。

但是当我尝试使用

NSString *stringDate = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd, yyyy hh:mma"];
NSDate *date=[dateFormatter dateFromString:stringDate];
NSLog(@"Date 1 : %@",date); //2013-02-28 12:00:00 +0000

NSString *stringDatee = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init];
[dateFormatterr setDateFormat:@"MMM dd, YYYY hh:mma"];
NSDate *datee=[dateFormatterr dateFromString:stringDatee];
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); //Jan 05, 2013 05:30PM

在这里,结果datedatee不同,我理解,但为什么日期 2 和日期 3 的结果不同?当我从字符串创建日期并再次将其反转为字符串时,但输出不匹配?

有没有人知道同样的原因?虽然它指定了一年中的一周,但我仍然应该得到相同的结果。

谢谢..

编辑 :-

如果我编码

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]];
NSLog(@"date: %@", dateString); //Feb 28, 2013 04:37PM

如果结果是正确的,但与我作为字符串传递给我得到的日期相同2013-01-05 12:00:00 +0000,请检查 NSLog 的日期 2,奇怪的结果,为什么?

4

4 回答 4

76

此外,在使用日期格式字符串时,使用正确的格式也很重要。

@"YYYY" 是基于周的日历年。

@"yyyy" 是普通日历年。

可以浏览整个博客,看看就好

在此处输入图像描述

https://web.archive.org/web/20150423093107/http://realmacsoftware.com/blog/working-with-date-and-time

http://realmacsoftware.com/blog/working-with-date-and-time(死链接)

于 2013-02-28T10:52:18.343 回答
32

一个常见的错误是使用 YYYY。yyyy 指定日历年,而 YYYY 指定年份(“一年中的一周”),用于 ISO 年-周日历。在大多数情况下,yyyy 和 YYYY 产生相同的数字,但它们可能不同。通常,您应该使用日历年。

来自Apple 文档

于 2013-02-28T10:54:19.837 回答
4
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999
              (see weekly calendar December month last Monday
              suppose leaf year + 1 day)
dd/MMM/yyyy - eg: ordinary - no problem.
于 2016-02-13T09:47:44.240 回答
1

所有答案都有区别yyyy,并且YYYY是另一个问题的正确答案。这个问题本身指的是另一件事。

为什么这两个值不同?(从问题中提取)

NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000
NSLog(@"Date 3 : %@", dateString); //Jan 05, 2013 05:30PM

@PJ 的答案是它们的价值并没有真正的不同。当您记录 NSDate (即日期 2)时,您将获得恰好位于 UTC Timezone上的对象的完整描述。记录日期 3 时不会发生此逻辑,因为它已经转换为字符串并应用了您的时区。

要以与获取日期 2 的“相同方式”打印日期 3。您应该为日期 3 指定 UTC 时区。像这样:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); 

希望这可以帮助。

tl;博士时区

于 2016-12-06T20:20:57.293 回答