25

我有问题。我得到 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,字符串“3:19” - 错误

在 12 小时模式下,日期为 1970-01-01 15:19:00,字符串为“3:19 PM” - 右

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

更重要的是,问题 2:如何将 12 小时制正确转换为 24 小时制?

我已经有代码来检测手机是否处于 24 小时模式,但除了在字符串中挖掘并将 3 与 15 交换之外,似乎没有一种干净的方法来做到这一点。

4

5 回答 5

29

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

于 2010-05-27T21:53:20.633 回答
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 小时格式

于 2012-09-12T12:03:57.137 回答
6

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

如果您在可可中使用预构建日期格式化程序,一切都会为您处理好。

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

NSDateFormatterShortStyle并且NSDateFormatterNoStyle有不同的品种。使用这些将确保您尊重用户为日期和时间选择的设置。

SDK 负责 12-14 小时时钟转换,如果您有用于存储日期的模型或一些值对象,请尝试将它们保持为NSDate. 这样,您可以仅在需要显示它们时对其进行格式化。当您可能从单独指定 GMT 的 xml 中解析日期或尝试添加和减去时,将日期保存为字符串可能会带来麻烦NSTimeIntervals

于 2010-02-01T00:16:10.687 回答
6

我从@"hh:mm:ss"更改为@"HH:mm:ss",时间样式从“ 1:03 PM ”更改为“ 13:03 ”。希望这会帮助你。

于 2014-01-28T09:04:44.933 回答
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]; 

日期为零。当我尝试这条路线时,我早些时候遇到了这个问题,但它不起作用。非常令人沮丧。

于 2010-02-01T00:49:54.427 回答