Objective c 在某些情况下,将NSString转换为NSDate会增加一年

Objective c 在某些情况下,将NSString转换为NSDate会增加一年,objective-c,ios,cocoa-touch,nsdate,Objective C,Ios,Cocoa Touch,Nsdate,自年底以来,我在将NSString转换为NSDate时遇到了一些问题。这段代码以前一直工作得很好,但它突然开始表现得异常出色 例如,当转换为NSDate时,2013-01-05变为2014-01-05 因为这是一整年,所以感觉不像是时区的惊吓 它不是在2012年开始做这件事的 有人知道什么地方出了问题吗 代码: NSString*dateString=postInfo.noteDate; NSString*newDateString=[dateString substringToIndex:10

自年底以来,我在将NSString转换为NSDate时遇到了一些问题。这段代码以前一直工作得很好,但它突然开始表现得异常出色

例如,当转换为NSDate时,2013-01-05变为2014-01-05

因为这是一整年,所以感觉不像是时区的惊吓

它不是在2012年开始做这件事的

有人知道什么地方出了问题吗

代码: 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返回2013-01-05


日期返回2014-01-05

对年份使用yyyy,而不是yyyy,这将给出周年。参见ISO标准

使用小写字母yyyy,yyyy是另一回事:

年份(以“一年中的一周”为基础的日历)。该年名称用于ISO 8601定义的ISO年-周日历,但可用于需要周日期处理的非公历日历系统。可能并不总是与日历年的值相同

请参见以下内容中的

Y 1..n 1997年(基于“一年中的一周”日历)。通常,长度指定填充,但对于两个字母,它还指定最大长度。该年名称用于ISO 8601定义的ISO年-周日历,但可用于需要周日期处理的非公历日历系统。可能并不总是与日历年的值相同

y 1..n 1996年。通常,长度指定填充,但对于两个字母,它还指定最大长度

所以你想要“yyyy”

这个“bug”也在《梦幻》中讨论过,这是任何iOS/Cocoa开发人员都必须看到的

维基百科关于


创建一个NSDate,然后创建另一个NSDate并覆盖第一个NSDate。照办

NSDate *date = [dateFormat dateFromString:newDateString];

我希望这能帮助你。试试这个

 - (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;
    }

谢谢大家的努力回答,不幸的是我不能检查你们所有人…:/谢谢大家的努力回答,不幸的是我不能检查你们所有人…:/不客气。vikingosegundo的答案很好地涵盖了细节,并提供了很好的参考资料。干杯。请确保观看链接视频。他们正在解释你可能遇到的更多陷阱。(也就是说,你正在删除时间部分。这可能——但不是必须——导致麻烦)是的,我也这么想,当我听说这个错误应该在7号消失时
 - (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;
    }