我遇到了问题。我得到了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之外,似乎没有一种干净的方法来执行此操作。
答案 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];
NSDateFormatterShortStyle
和NSDateFormatterNoStyle
有不同的变体。
使用这些将确保您尊重用户为日期和时间选择的设置。
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];
日期没有了。当我尝试这条路线时,我遇到了这个问题,而且它没有用。非常令人沮丧。