尝试在Objective-C中解析日期时出错

时间:2016-03-31 10:58:37

标签: ios objective-c

当我尝试将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

这是我的输出:

this is the log image

  

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

2 个答案:

答案 0 :(得分:5)

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

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

您通常可以使用没有此问题的预设GMT时区来解决问题,例如

dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[NSTimeZone systemTimeZone].secondsFromGMT];

请注意,由于您没有解析时间,因此时区差异不应影响您。

重现的步骤

将您计算机上的时区设置为约旦时区: enter image description here

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"

答案 1 :(得分:1)

我尝试了你的代码,它给了我2022年的null,但2018,2020年它给了4月...很奇怪!

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

enter image description here

更新:

请解析字符串,如下所示: 2016-04-01 01:00

由于约旦的夏令时,时钟将被移动+1小时,因此宇宙中没有时间像这样: 2016-04-01 00:00

这应解决你对nil对象的问题。