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

标签 ios objective-c

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

最佳答案

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

例如,在约旦,夏令时更改为 2016 年 4 月 1 日 00:00 => 2016 年 4 月 1 日 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"

关于ios - 尝试在 Objective-C 中解析日期时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49577931/

相关文章:

ios - 如何在IOS中从sqlite3_stmt sqlite3获取long long值?

objective-c - 使用 ARC 的手动对象生命周期

mysql - 直接从 iPad 应用程序连接到 MySQL(不通过 PHP 等)

iOS - 如何包含可以通过项目的相对路径引用的 javascript 文件?

iOS 加载屏幕 - Default.png

objective-c - 在 SpriteKit 中使用 SKLabelNode 插入换行符

ios - NSURLSession 操作指南

objective-c - 以编程方式关闭和打开蓝牙

objective-c - setValue :forKey: search for the KVC-compliant method or ivar? 的顺序是什么

iOS - 用一个按钮杀死应用程序?