NSDateFormatter dateFromString和iPhone 24小时格式混淆

时间:2010-02-01 00:08:13

标签: iphone cocoa-touch time nsdateformatter

我遇到了问题。我得到了12小时格式的传入时间字符串,我将它们转换为NSDate对象。当iPhone处于12小时格式时,没问题。但是当它采用24小时格式时,事情就出错了。以下是一些示例代码:

NSString *theTime = @"3:19 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"]; // "3:19 PM"
NSDate *date = [formatter dateFromString:theTime];
NSString *theString = [formatter stringFromDate:date];

在24小时模式下,日期是1970-01-01 03:19:00, theString 是“3:19” - 错误

在12小时模式下,日期是1970-01-01 15:19:00, theString 是“3:19 PM” - 右

所以...问题1:为什么设备的24小时设置会覆盖我的日期格式化程序设置?

更重要的是,问题2:如何从12小时到24小时进行正确的转换?

我已经有代码来检测手机是否处于24小时模式,但除了在字符串中搜索并使用15交换3之外,似乎没有一种干净的方法来执行此操作。

5 个答案:

答案 0 :(得分:29)

不确定您是否仍然需要它,但我遇到了类似的问题,它通过设置日期格式化程序的语言环境得到解决。也就是说,如果您想强制它为12小时模式,无论用户的24/12小时模式设置如何,您都应该将语言环境设置为en_US_POSIX。

答案 1 :(得分:14)

此行为的原因是Locale,设置了正确的Locale

    NSString *strAgendaDate = @"01/17/2012 12:00 AM";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

    [dateFormatter setDateFormat:AgendaDateFormatForMeeting];
    NSDate *meetingDate = [dateFormatter dateFromString:aStrDate];
    [dateFormatter setDateFormat:AgendaDateRepresentation];
    strAgendaDate = [dateFormatter stringFromDate:meetingDate];

适用于24小时和12小时格式

答案 2 :(得分:6)

我相信@“h:mm a”应该是@“HH:mm a”。

如果你在cocoa中使用pre-build dateformatter,那么一切都将为你照顾。

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];

NSDateFormatterShortStyleNSDateFormatterNoStyle有不同的变体。 使用这些将确保您尊重用户为日期和时间选择的设置。

SDK会处理12-14小时的时钟转换,如果您有一个模型或某个值对象来存储您的日期,请尝试将它们保留为NSDate。这样,只有在需要显示它们时才可以格式化它们。将日期保存为字符串可能会打开一个麻烦的世界,您可以从单独指定GMT的xml解析它们或尝试添加和减去NSTimeIntervals

答案 3 :(得分:6)

我从 @“hh:mm:ss”改为 @“HH:mm:ss”,时间风格从“ 1:03更改PM “to” 13:03 “。 希望这会对你有所帮助。

答案 4 :(得分:1)

好的,我发表了评论,但它将所有代码压缩在一起,所以我必须用评论“回答”我的问题:

感谢。我用这段代码给了它一个旋转:

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];       
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
NSDate *date = [timeFormatter dateFromString:theTime]; 
NSString *theString = [timeFormatter stringFromDate:date]; 

日期没有了。当我尝试这条路线时,我遇到了这个问题,而且它没有用。非常令人沮丧。