[英]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
。 我也尝试过MMddyyyy
和MM'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.