Converting NSString to NSDate adds one year in some cases

假如想象 提交于 2020-01-03 06:29:40

问题


I have some issues converting an NSString to NSDate since the end of the year. The code have always worked great before, but it suddenly started to behave wierd...

For example 2013-01-05 becomes 2014-01-05 when converted to NSDate.

Since it's a whole year it doesn't feel like it's the timezone spooking.

It's not doing this with dates from 2012.

Does anybody have an idea of what might be wrong?

Code: NSString *dateString = postInfo.noteDate; NSString *newDateString = [dateString substringToIndex:10];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"YYYY-MM-dd"]; 
    NSDate *date = [[NSDate alloc] init];
    date = [dateFormat dateFromString:newDateString];

newDateString returns 2013-01-05

date returns 2014-01-05


回答1:


From the docs:

Y 1..n 1997 Year (in "Week of Year" based calendars). Normally the length specifies the padding, but for two letters it also specifies the maximum length. This year designation is used in ISO year-week calendar as defined by ISO 8601, but can be used in non-Gregorian based calendar systems where week date processing is desired. May not always be the same value as calendar year.

y 1..n 1996 Year. Normally the length specifies the padding, but for two letters it also specifies the maximum length.

So you want 'yyyy'

This 'bug' is also discussed in the fantastic WWDC 2011 Video "Session 117 - Performing Calendar Calculations", a must-see for any iOS/Cocoa-Developer.

Wikipedia article on ISO 8601


NSDate *date = [[NSDate alloc] init];
date = [dateFormat dateFromString:newDateString];

You create a NSDate and than you create another and overwrite the first one. Just do

NSDate *date = [dateFormat dateFromString:newDateString];



回答2:


use yyyy for year not YYYY, which gives week year. see the ISO standard.




回答3:


Use yyyy in small letters, YYYY is another thing:

Year (in "Week of Year" based calendars). This year designation is used in ISO year-week calendar as defined by ISO 8601, but can be used in non-Gregorian based calendar systems where week date processing is desired. May not always be the same value as calendar year.

see http://www.unicode.org/reports/tr35/tr35-19.html#Date_Format_Patterns




回答4:


I hope this will helps u. Try this

 - (NSDate*) dateFromString:(NSString*)aStr
    {

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];

        [dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss a"];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

        NSLog(@"%@", aStr);
        NSDate   *aDate = [dateFormatter dateFromString:aStr];
        [dateFormatter release];
        return aDate;
    }


来源:https://stackoverflow.com/questions/14184648/converting-nsstring-to-nsdate-adds-one-year-in-some-cases

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!