如何在ios中以24小时格式显示上午/下午

Posted

技术标签:

【中文标题】如何在ios中以24小时格式显示上午/下午【英文标题】:how to show am/pm in 24 hours format in ios 【发布时间】:2012-10-13 08:10:56 【问题描述】:

我有一个应用程序让用户选择他们的语言,在选择语言后,它还会根据国家/地区的日期格式更改日期和时间。

我这样做是通过 NSDateFormatter.- [dateFormatter setDateFormat:.....]; 对于美国英语 - 我使用“h:mm a” - 显示上午/下午设置。

问题是:am pm 仅在我的 iPhone 处于 12 小时模式时才会显示, 我猜是因为它会自动检查 iPhone 的时间格式, 有没有办法覆盖这个?上午/下午也将在 24 小时模式下显示。

【问题讨论】:

【参考方案1】:

这对我有用:

dateFormatter.dateFormat = @"H:mm a";

例子:

// Set up formatter
NSDateFormatter *dateFormatter;
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"H:mm a";

// Print test date
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:8900];
NSLog(@"%@", [dateFormatter stringFromDate:date]);

输出:

14:23 PM

【讨论】:

根据你的“语言选择”功能:你为什么不使用苹果内置的本地化功能?见Guidelines for Internationalization【参考方案2】:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"hh:mm:ss a"];
NSString *date = [formatter stringFromDate:[NSDate date]];
NSArray *foo1 = [date componentsSeparatedByString:@" "];


NSRange amRange = [date rangeOfString:[formatter AMSymbol]];
NSRange pmRange = [date rangeOfString:[formatter PMSymbol]];
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

NSArray *foo2 = [[foo1 objectAtIndex:0] componentsSeparatedByString:@":"];
int hour = [[foo2 objectAtIndex:0] intValue];
int minute = [[foo2 objectAtIndex:1] intValue];
int second = [[foo2 objectAtIndex:2] intValue];

BOOL isAM = NO;

if (is24h) 
    if (hour >= 12) 
        isAM = NO;
     else 
        isAM = YES;
    
 else 
    isAM = [[foo1 objectAtIndex:1] isEqualToString:@"AM"];

【讨论】:

【参考方案3】:

假设您需要为面向用户的字符串自定义日期格式,因为 dateStyletimeStyle 的预设不适合您,执行此操作的适当方法是将 setLocalizedDateFormatFromTemplate 与 " j" 或 "jj" 的小时数,具体取决于您是否想要零填充(在使用该样式的区域中,大概 - 到目前为止,它似乎总是忽略零填充,但我猜它取决于区域)。

let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("jj:mm")

如果用户所在的地区默认使用 24 小时制和/或他们开启了 24 小时制(通过 ios 设置中的开关),它将输出诸如“17:53”之类的字符串。否则它会输出像“5:53 PM”这样的字符串。

请注意,如果您在格式化程序上覆盖 locale,请务必在调用 setLocalizedDateFormatFromTemplate 之前设置它。

模板方法会自动本地化您的字符串以使用适当的样式。

更多信息可以在the documentation“使用用户可见的日期和时间表示”下找到。

【讨论】:

以上是关于如何在ios中以24小时格式显示上午/下午的主要内容,如果未能解决你的问题,请参考以下文章

fullCalendar 的 24 小时时间格式(所以没有上午到下午)

如何在上午/下午 24 小时之间设置日期

Javascript:将 24 小时时间字符串转换为 12 小时时间,上午/下午且无时区

如何更改时间格式?

在 x 轴上显示 24 小时的 Highcharts

iOS:从 NSDate 获取本地化小时