NSDateFormatter中“ YYYY”和“ yyyy”之间的区别


77

“ 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,奇怪的结果,为什么?


1
人们应该观看WWDC 2011的视频,该视频称为“ Session 117-执行日历计算”,59:11,142.2 MB(HD),让您对StarTrek的虚拟现实有所了解吗?如果妳还没有看到该视频,请观看它,这是非常有趣的,如果ü像这样的东西。

@ DigiMonk谢谢,我来看看。–
PJ


1
主要是,YYYY有时会工作,而yyyy会一直工作。如果您查看规格,则(明确)清楚原因。
热门点击2014年

而且date2和date3之间的差异与年份格式无关,这完全是由于NSDatedescription方法始终以这种方式(以及UTC)显示的事实– NSDate中没有“格式”(或时区) 。
热门点击2014年

Answers:


71

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

@“ 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(无效链接)


感谢您的回答,您是否检查了日期2和日期3的NSLog?他们为什么不同?我正在传递相同的格式和相同的东西..
PJ

1
我希望它是因为您将日期对象转换为字符串,这就是为什么它给出2个不同结果的原因。
X因子

每当您将日期转换为字符串时,它都会向您显示相同的结果,请查看博客iosdevelopertips.com/cocoa/date-formatters-examples-take-3.html
X-Factor,

我正在用相同的格式化程序执行string-> date,然后执行date-> string,所以理想情况下应该再次返回我之前通过的相同日期,但事实并非如此。为什么?
2013年

4
链接已断开。
Clashsoft

29

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

来自Apple Docs


对不起这是我的错。一年有52周。该值应该是日期是星期几的返回值。这对于计算财务项目或重复的日历事件将是很好的。
Gardner Bickford

1
我同意该标识符令人困惑并且选择不当。有标准理由必须存在它:en.wikipedia.org/wiki/ISO_week_date
Gardner Bickford

datee是一个NSLog对象。与字符串连接时,它将返回自身的字符串表示形式。这意味着在将datee传递给NSLog()时,您依赖于NSDate的默认格式。如果使用dateWithString创建NSDate对象,则可能会看到差异。
Gardner Bickford

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.

您能否进一步描述您的答案?
PJ

仅查看12月的周历和周一的日期。
gowthaman-mallow

1

所有答案都与众不同yyyyYYYY是另一个问题的正确答案。问题本身是另一回事。

为什么这两个值不同?(摘自问题)

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 TimeZone。

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; dr时区

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.