Difference between 'YYYY' and 'yyyy' in NSDateFormatter

63,490

Solution 1

Also when using a date format string using the correct format is important.

@"YYYY" is week-based calendar year.

@"yyyy" is ordinary calendar year.

You can go through the whole blog, its a good to give it a look

enter image description here

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

http://realmacsoftware.com/blog/working-with-date-and-time (dead link)

Solution 2

A common mistake is to use YYYY. yyyy specifies the calendar year whereas YYYY specifies the year (of “Week of Year”), used in the ISO year-week calendar. In most cases, yyyy and YYYY yield the same number, however they may be different. Typically you should use the calendar year.

from Apple Docs

Solution 3

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.

Solution 4

All answers differentiating yyyy and YYYY are right answers for another question. The question itself refers to another thing.

Why does these two values are different? (extracted from question)

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

The answer here @P.J is that they are not really different in value. When you log an NSDate (which is Date 2) you are getting the full description of your object which happens to be on UTC Timezone. This logic does not happen when logging Date 3 because it was already converted to a String and applied your Timezone.

For printing Date 3 the 'same way' as you are getting Date 2. You should specify UTC TimeZone for Date 3. Something like this :

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); 

Hope this helps.

tl;dr the Timezone

Share:
63,490

Related videos on Youtube

P.J
Author by

P.J

Full Stack Developer with expertise in iOS Application Development Email address : [email protected] Facebook : http://www.facebook.com/PrateekAJain

Updated on February 09, 2020

Comments

  • P.J
    P.J about 4 years

    What is exact difference between 'YYYY' and 'yyyy'. I read in this link, it states that

    A common mistake is to use YYYY. yyyy specifies the calendar year whereas YYYY specifies the year (of “Week of Year”), used in the ISO year-week calendar. In most cases, yyyy and YYYY yield the same number, however they may be different. Typically you should use the calendar year.

    But when I try to use

    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
    

    As here, result to date and datee different, which I understood, but why result of date 2 and date 3 are different? As I am creating date from string and reversing same to string again, but output mismatches?

    Has anybody knows reason about same?. Though it specifies week of year, still I should get result same.

    Thanks..

    EDIT :-

    If I code

    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
    

    If results me proper result, but same which I pass as string to date I get 2013-01-05 12:00:00 +0000, check date 2 of NSLog, Strange result, why?

    • Admin
      Admin about 11 years
      One should watch the WWDC 2011 Video called "Session 117 - Performing Calendar Calculations", 59:11, 142.2 MB (HD)" to get enlightened about virtual reality a là StarTrek? Nope. I mean calendar-based calculations- and what not. If u haven't seen this video please watch it, it's very interesting if u like stuff like that.
    • P.J
      P.J about 11 years
      @DigiMonk Thanks, I will look at it..
    • Parag Bafna
      Parag Bafna about 11 years
    • Hot Licks
      Hot Licks about 10 years
      Mainly, YYYY works some of the time, while yyyy works all of the time. If you look at the spec then it's (sorta) clear why.
    • Hot Licks
      Hot Licks about 10 years
      And the difference between date2 and date3 has nothing to do with the year format and is purely due to the fact that the NSDate description method always displays that way (and in UTC) -- there is no "format" (or timezone) in an NSDate.
  • P.J
    P.J about 11 years
    Thanks for your answer, have you checked my NSLog of date 2 and date 3? Why are they different? I am passing same format, and same thing..
  • X-Factor
    X-Factor about 11 years
    I hope its because you are converting a date object into a string, thats why it is giving 2 different results.
  • X-Factor
    X-Factor about 11 years
    whenever you convert a date into a string it shows you the same result you are seen check the blog iosdevelopertips.com/cocoa/date-formatters-examples-take-3.h‌​tml
  • P.J
    P.J about 11 years
    I am doing string->date and then date->string with same formatter, so ideally is should return me same date again which I passed earlier, but it doesn't.. Why?
  • Gardner Bickford
    Gardner Bickford about 11 years
    Sorry, my bad. There are 52 weeks in a year. This value should be return which week of the year the date is. This would be good for calculating finance items or recurring calendar events.
  • X-Factor
    X-Factor about 11 years
    No thats the case, whenever you convert a date object into string, it gives you the result like (Jan 05, 2013 05:30PM - full object) i have given you the link go through it.
  • P.J
    P.J about 11 years
    No, dont agree with you, reason is that YYYY shows me week based calendar, that is right, but when i convert this week based calendar, I should get correct output?
  • Gardner Bickford
    Gardner Bickford about 11 years
    I agree that this identifier is confusing and was not well selected. There are standards reasons why it must exist: en.wikipedia.org/wiki/ISO_week_date
  • X-Factor
    X-Factor about 11 years
    Sorry bro, then i think i dont have any logical reasoning on this issue except that its the tostring method of NSDate, which converts date into that format :)
  • Gardner Bickford
    Gardner Bickford about 11 years
    datee is an NSLog object. It will return a string representation of itself when concatenated with a string. This means that you are relying on the default format of NSDate when passing datee to NSLog(). If you create NSDate objects with dateWithString you may see the difference.
  • P.J
    P.J about 8 years
    Can you describe your answer more?
  • gowthaman-mallow
    gowthaman-mallow about 8 years
    see weekly calendar December month only and see monday date.
  • Clashsoft
    Clashsoft over 5 years
    The link is down.
  • André C. Andersen
    André C. Andersen about 4 years
    Content in link is now recovered.