繁体   English   中英

来自 NSDateFormatter 的 nil 结果,格式字符串为 0

[英]nil result from NSDateFormatter with 0's in format string

我从 web 服务中得到一个日期,格式MM00yyyy它只是两位数的月份,后跟两个 0,然后是四位数的年份。 当我这样做时:

NSString *expDate = @"12001975";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM00yyyy"];
NSDate postDate = [dateFormat dateFromString:expDate];

[dateFormat dateFromString]出于某种原因返回nil 我也尝试过MMddyyyyMM'0''0'yyyy ,但都没有成功。 我正在转换一个类似的日期,除了 0 实际上是使用相同方法没有问题的日子。

为了使它工作,我将使用以下模式 MMHHyyyy。 由于您只需要日期而不需要小时,因此 HH 将使用 00 将时间设置为第零小时,因此您将获得所需的日期。 同样,这只是一个 hack 和解决方法,仅用于解决您当前的问题。

查看 Apple 的日期格式指南 “使用格式字符串指定自定义格式”部分列出了各种 iOS 版本支持的用于指定格式字符串的所有不同标准。 我会说“00”是不允许的,这就是“MM00yyyy”失败的原因。 同样,“MMddyyyy”也失败了,因为没有一天可以是“00”。

正如Apple doc建议的那样,我不知道您是否可以使用 UNIX 功能获得更多运气:

对于始终保证使用相同日历的固定、非本地化格式的日期和时间,有时使用标准 C 库函数 strptime_l 和 strftime_l 可能更容易和更有效。

请注意,C 库也有当前语言环境的概念。 为了保证固定的日期格式,您应该传递 NULL 作为这些例程的 loc 参数。 这会导致他们使用 POSIX 语言环境(也称为 C 语言环境),这相当于 Cocoa 的 en_US_POSIX 语言环境,如本示例所示。

 struct tm  sometime;
 const char *formatString = "%Y-%m-%d %H:%M:%S %z";
 (void) strptime_l("2005-07-01 12:00:00 -0700", formatString, &sometime, NULL);
 NSLog(@"NSDate is %@", [NSDate dateWithTimeIntervalSince1970: mktime(&sometime)]);
 // Output: NSDate is 2005-07-01 12:00:00 -0700

获得正确的格式字符串似乎更像是艺术而不是科学。 我建议你创建一个没有 00 的新字符串,然后让你的 DateFromatter 进程使用“MMyyyy”。

虽然这可能不是“正确”的方法,但它应该可以很快解决您的问题。

零是不受支持的符号。 Apple 支持以下字符的日期格式: http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns请参阅日期部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM