在Objective-C中尝试parsingdate时出现问题

当我试图将April from 04 (MM)转换为Apr (MMM)它变回了nil ,这是iOS中的一个已知问题还是我做错了什么?

这是我的代码检查:

 NSString *dateString=@"2016-04-01"; NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; NSDate* myDate = [dateFormatter dateFromString:dateString]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"MMM"]; NSString *stringFromDate = [formatter stringFromDate:myDate]; NSLog(@"%@ == %@",dateString,stringFromDate); 

当更改dataString=@"2015-04-01"stringFromDate返回Apr

这是我的输出:

这是日志图像

2016-04-01 12:17:45.708 [32172:2389414] 2016-04-01 ==(null)

2016-04-01 12:17:47.446 [32172:2389414] 2015-04-01 == Apr

这可能是您所在时区的问题。 请注意,在没有时间parsingdate时,时间假定为零。 但是,有些特定的时间不存在,通常是由于夏令时变化(发生在世界各地的三月)或由于特定的本地时间变化。

例如,在约旦,DST变更为Apr 1 2016, 00:00 => Apr 1 2016, 01:00 。 这意味着Apr 1 2016, 00:00不存在,因为March 31 2016, 23:59March 31 2016, 23:59立即变为Apr 1 2016, 01:00 。 如果date不存在,则date格式化程序必须返回nil

您通常可以通过使用不存在此问题的预设GMT时区来解决问题,例如

 dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

请注意,由于您不parsing时间,所以时区差异不应该影响您。

重现步骤

将您的机器上的时区设置为Jordan时区: 在这里输入图像说明

 NSString *dateString = @"2016-04-01"; NSDateFormatter* parsingFormatter = [[NSDateFormatter alloc] init]; parsingFormatter.dateFormat = @"yyyy-MM-dd"; NSLog(@"Parsed: %@", [parsingFormatter dateFromString:dateString]); // "(null)" 

与时区修复:

 NSString *dateString = @"2016-04-01"; NSDateFormatter* parsingFormatter = [[NSDateFormatter alloc] init]; parsingFormatter.dateFormat = @"yyyy-MM-dd"; parsingFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; NSLog(@"Parsed: %@", [parsingFormatter dateFromString:dateString]); // "2016-04-01 00:00:00 +0000" 

我试过你的代码,它给了我2022年为空,但2018,2020年,它给四月…怪异!

  NSString *dateString=@"2022-04-01"; NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; NSDate* myDate = [dateFormatter dateFromString:dateString]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"+5:30"]]; [dateFormatter setDateFormat:@"MMM"]; NSString *stringFromDate = [dateFormatter stringFromDate:myDate]; NSLog(@"%@ == %@",dateString,stringFromDate); 

在这里输入图像说明

更新:

请parsingstring为:2016-04-01 01:00

由于夏时制在约旦时钟将被转移+1小时,所以宇宙中没有这样的时间:2016-04-01 00:00

这应该解决与零对象的问题。