6

我已经阅读了 DateFormatting 指南,但我仍然无法获得可用的格式化程序。

NSString *string = @"0901Z 12/17/09";   
//This is a sample date. The Z stands for GMT timezone
//The 0901 is 09h 01m on a 24 hour clock not 12.
//As long as I can get the hours/min & date from the string I can deal with the time zone later
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"hhmm'Z' MM/dd/yy"];
NSDate *date = [dateFormat dateFromString:string];
4

2 回答 2

7

当我尝试时,这对我有用。添加NSLog(@"%@", date)到代码的末尾会给我这个输出:

2010-02-28 12:17:22.921 app[9204:a0f] 2009-12-17 09:01:00 -0800

你看到的问题是什么?

编辑:我想通了,你对 没有问题09:01,但是其他 24 小时时间,比如14:25,对吗?将格式化程序更改为:

@"HHmm'Z' MM/dd/yy"
于 2010-02-28T20:18:10.710 回答
2

复制自我在这里回答的类似问题:NSDateFormatter 在 iOS 3.0 中为 @"dd-MM-yy" 返回 nil

如果您使用用户可见的日期,则应避免设置日期格式字符串。以这种方式格式化日期是不可本地化的,并且无法预测您的格式字符串将如何在所有可能的用户配置中表示。相反,您应该尝试限制自己设置日期和时间样式(通过 -[NSDateFormatter setDateStyle:] 和 -[NSDateFormatter setTimeStyle:])。

另一方面,如果您使用的是固定格式的日期,则应首先将日期格式化程序的语言环境设置为适合您的固定格式的内容。在大多数情况下,选择的最佳语言环境是“en_US_POSIX”,这是一种专门设计用于生成美国英语结果的语言环境,无论用户和系统偏好如何。“en_US_POSIX”在时间上也是不变的(如果美国在未来的某个时候改变了它格式化日期的方式,“en_US”将改变以反映新的行为,但“en_US_POSIX”不会),并且在机器之间( "en_US_POSIX" 在 iPhone OS 上的工作方式与在 Mac OS X 上的工作方式相同,在其他平台上也一样)。

将“en_US_POSIX”设置为日期格式化程序的语言环境后,您可以设置日期格式字符串,日期格式化程序将对所有用户保持一致。

上述信息及更多信息可在 Apple 的技术问答 QA1480中找到

这是我的应用程序中实现上述建议的代码片段:

static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
             initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil.");
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}
于 2011-05-06T19:52:10.867 回答