我有一个应用程序,我让用户选择他们的语言,在选择语言后,它还会根据国家/地区的日期格式更改日期和时间。
我是通过NSDateFormatter.- [dateFormatter setDateFormat:.....]; 对于英语 - 美国 - 我使用" h:mm a" - 显示上午/下午设置。
问题是:只有当我的iPhone处于12小时模式时才会显示上午 我猜是因为它会自动检查iPhone的时间格式, 有没有办法覆盖这个? am / pm也将以24模式显示。
答案 0 :(得分:7)
这对我有用:
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
答案 1 :(得分:0)
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"];
}
答案 2 :(得分:0)
由于dateStyle
和timeStyle
的预设不会为您裁剪,因此假设您需要为面向用户的字符串自定义日期格式,执行此操作的适当方法是使用{ {3}}的小时数取决于“ j”或“ jj”,具体取决于您是否要零填充(在使用该样式的区域中,大概是-到目前为止似乎总是零填充,但我猜它是区域-依赖)。
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("jj:mm")
如果用户所在的地区默认情况下使用24小时制和/或他们已打开24小时制(通过iOS设置中的开关),则会输出“ 17:53”之类的字符串。否则,它将输出“ 5:53 PM”之类的字符串。
请注意,如果您要覆盖格式化程序上的locale
,请确保在调用setLocalizedDateFormatFromTemplate
之前先进行设置。
模板方法将自动将字符串本地化以使用适当的样式。
更多信息可以在setLocalizedDateFormatFromTemplate
下的“使用日期和时间的用户可见表示形式”下找到。