在Obj-C中将24h转换为12h时间格式

时间:2010-10-28 16:50:51

标签: objective-c nsdate nsdateformatter

我目前以24小时格式显示时间,因为对我来说,使用我拥有的数据最简单。

我在“午夜以来的分钟”中得到时间,例如,07:00或7:00 am是“420”,21:30或9:30 pm是“1290”,依此类推。

[NSString stringWithFormat:@"%02d:%02d - %02d:%02d", (open / 60), (open % 60), (close / 60), (close % 60)]

有没有一种很好的方法可以使用NSDateFormatter从24h转换为12h?我尝试了很多东西,但我从来没有得到100%正确的格式化。

我也尝试了很多if语句,但最后的代码行太多了,在我看来这对于这样一个相对“简单”的工作来说应该是完全没有必要的。

此外,无论我尝试,我最终都会错误地将12h格式化为开始时没有“1”的小时,例如“09:30 am”等。我可以通过查找后缀来删除它,但是这似乎很乏味和怪异。

4 个答案:

答案 0 :(得分:11)

您应该使用系统的默认日期格式:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setHour:hours];
[comps setMinute:minutes];
NSDate* date = [[NSCalendar currentCalendar] dateFromComponents:comps];
NSString* dateString = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterNoStyle timeStyle:NSDateFormatterLongStyle];

或者,如果你坚持可以做到

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"hh:mm a"];
NSString* dateString = [dateFormatter stringFromDate:date];

答案 1 :(得分:4)

对于像我这样的新人,我在日期格式化程序上遇到困难,发现[NSCalendar currentCalendar]将使用用户首选项来设置时区。在我的情况下,我想转换一个服务器给我的时间,所以它总是错误的。在我的例子中,我使用了这个简单的函数。

- (NSString *)formatTime:(NSString *)time
{
  NSString *hour = [time substringWithRange:NSMakeRange(0, 2)];
  NSString *minute = [time substringWithRange:NSMakeRange(2, 2)];

  NSString *tail = ([hour integerValue] > 11) ? @"PM" : @"AM";    

  return [NSString stringWithFormat:@"%@:%@ %@", hour, minute, tail];    
}

答案 2 :(得分:1)

你可以试试这个。它对我有用

    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [df setTimeZone:[NSTimeZone systemTimeZone]];
    [df setDateFormat:@"yyyy-mm-dd hh:mm:ss"];

    NSDate* newDate = [df dateFromString:[df stringFromDate:[NSDate date]]];
    [df setDateFormat:@"hh:mm a"];
    newDate = [df stringFromDate:[NSDate date]];

答案 3 :(得分:0)

检查你的分钟是否小于720(12小时),如果是,那么它的AM,如果不是它的PM(所以你需要花费数小时-12从军队到12h)然后根据需要添加后缀。它不漂亮,但它是一个相对简单的格式化工作。