【问题标题】:Error when converting date string to NSObject将日期字符串转换为 NSObject 时出错
【发布时间】:2018-08-23 09:42:10
【问题描述】:

我正在向服务器发送详细信息,这需要我将日期字符串转换为 NSDate 对象。携带这个对象的字典是这样声明的

NSMutableDictionary *detailsRequest = [NSMutableDictionary dictionary];

那么将日期字符串转换为对象的代码如下所示

[_dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[_dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"];
[_dateFormatter setAMSymbol:@"am"];
[_dateFormatter setPMSymbol:@"pm"];
[detailsRequest setObject:[_dateFormatter stringFromDate:[_dateFormatter dateFromString:val]] forKey:NDUserServerDateOfBirthKey];

键 NDUserServerDateOfBirthKey 被声明为这样的常量

NSString * const NDUserServerDateOfBirthKey     = @"dob";

val 的值始终是 '09/08/1987',当它到达最后一行时,它会抛出一个 SIGABRT 错误,上面写着

2018-08-23 10:33:04.612769+0100 ClientCore[353:36543] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: dob)'

我尝试将 _dateFormatter 缩减为 [_dateFormatter setDateFormat:@"yyyy-MM-dd"];但它仍然会因同样的错误而崩溃。我的字符串日期总是有一个值,所以我做错了什么?

【问题讨论】:

  • [_dateFormatter dateFromString:val] 为零。现在,问题是val 是什么?与NSDictionaryNSObjectXCode 完全无关,我将更改标签。这是一个基本的NSDateFormatter 问题。就像你这样:"yyyy-MM-dd'T'HH:mm:ss.SSSZZZ" 应该如何匹配"09/08/1987"?它不能。 dateFormat 应该是 dd/MM/yyyyMM/dd/yyyy,具体取决于第一个是月份还是月份中的某一天。
  • 使用 stringFromDate 方法,您不是将 NSString 转换为 NSDate,而是将 NSDate 转换为 NSString
  • 此外,“日期字符串”和“NSObject”是什么意思?任何对象都继承自 NSObject,并且没有像“日期字符串”这样的对象——它是 NSDate 或 NSString——你能澄清一下你需要做什么吗?

标签: objective-c nsdateformatter


【解决方案1】:

该错误是因为日期格式错误,无法转换日期字符串。

请尝试理解格式。日期字符串包含日 (d)、月 (M) 和年 (y) 斜线分隔 - 或月 (M)、日 (d) 和年 (y) - 但没有字母 T,没有连字符 (- )、无小时 (H)、无分钟 (m)、无秒 (s)、无毫秒 (S)、无时区 (Z) 和无上午/下午

格式为@"dd/MM/yyyy"@"MM/dd/yyyy"

你为什么要将字符串转换为日期,然后立即返回字符串?

如果您想将dd/MM/yyyy 转换为 ISO8601,您需要两种不同的输入和输出格式

NSString *val = @"09/08/1987";
NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc] init];
_dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
_dateFormatter.dateFormat = @"dd/MM/yyyy";
NSDate *date = [_dateFormatter dateFromString:val];
_dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZZZ";
NSString *convertedString = [_dateFormatter stringFromDate:date];

【讨论】:

  • 它可能奏效了,但如果你知道自己在做什么,那就太好了,因为正如@vadian 所提到的,你正在来回移动东西并转换比你更多需要
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2020-10-13
相关资源
最近更新 更多