如何本地化iPhone上的“计时器”

我需要在iPhone上以“hh:mm:ss”格式显示一个计时器,但希望它本地化。 例如,芬兰在时间分量(hh.mm.ss)之间使用句点而不是冒号。 如果我正在处理一个“时间”,苹果的NSDateFormatter会做的伎俩,但我需要显示24小时以上的时间。

我还没有能够使一个NSDate / NSDateFormatter的工作,因为当你做一个秒…

NSDate *aDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTotalSeconds]; 

…每86,400秒(一天的价值)NSDate自动递增一天,小时,分钟和秒数回到零。 我需要使它在没有翻转的情况下工作几秒钟。 例如,我想在86401秒内显示24:00:01(或芬兰的24.00.01)。

我的代码pipe理总秒数罚款,所以我唯一的问题是显示。 一个简单的…

 [NSString stringWithFormat:@"%d%@%d%@%d", hours, sepString, mins, sepString, secs] 

…将工作,如果我能find一种方法来获得本地化的“sepString”(时间分量分隔符)。 NSLocale似乎没有这个。

思考?

对于任何语言环境来说,这是一个公认的方法来获取时间分量分隔符。 它应该在iOS 3.2及更高版本上工作。 我知道代码可以更简洁,但我把我的“最大的冗长”的标志,使其尽可能可读。

 //------------------------------------------------------------------------------ - (NSString*)timeComponentSeparator { // Make a sample date (one day, one minute, two seconds) NSDate *aDate = [NSDate dateWithTimeIntervalSinceReferenceDate:((24*60*60)+62)]; // Get the localized time string NSDateFormatter *aFormatter = [[NSDateFormatter alloc] init]; [aFormatter setDateStyle:NSDateFormatterNoStyle]; [aFormatter setTimeStyle:NSDateFormatterShortStyle]; NSString *aTimeString = [aFormatter stringFromDate:aDate]; // Not using +localizedStringFromDate... because it is iOS 4.0+ // Get time component separator NSCharacterSet *aCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@":-."]; NSRange aRange = [aTimeString rangeOfCharacterFromSet:aCharacterSet]; NSString *aTimeComponentSeparator = [aTimeString substringWithRange:aRange]; // Failsafe if ([aTimeComponentSeparator length] != 1) { aTimeComponentSeparator = @":"; } return [[aTimeComponentSeparator copy] autorelease]; } //------------------------------------------------------------------------------ 

这里是关于这个主题的信息,可能试图找出世界上不同地区使用什么字符来分隔时间分量。 我经历了我的iPhone上的所有“区域格式”设置 – iOS版本4.1(8B117),我发现除七个区域以外的所有区域都使用冒号(hh:mm)。 这里是其他人(他们的NSLocaleCountryCode是花括号)。

使用一段时间,hh.mm

•丹麦(丹麦){DK}
•芬兰(芬兰){FI}
•塞尔维亚黑山(西里尔文){ME}
•塞尔维亚黑山(拉丁){ME}
•塞尔维亚(西里尔){RS}
•塞尔维亚语(拉丁语){RS}

用短划线,hh-mm

•Marathi(印度){IN}

请注意,印度(不是Marathi-India)也有国家代码IN,并使用冒号。 所以只检查国家代码是不够的,你将不得不看看其他NSLocale字段。 我还没有经过所有的领域,但我怀疑NSLocaleScriptCode或NSLocaleVariantCode可能会区分它们。 这个复杂性就是为什么苹果应该在SDK中向我们揭示这个angular色。 我在雷达上登记过,所以如果你同意的话,请求也是这样,请求数量在他们决定做的事情上是很重要的。

如果一切都失败,请查看使用NSLocalizedString()或NSLocalizedStringWithDefaultValue。

首先你应该使用NSDateFormatter格式化你的date。 Applebuild议使用用户可以在设置中自定义的内置样式。 下面的代码是直接从苹果文档:

  NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:118800]; NSString *formattedDateString = [dateFormatter stringFromDate:date]; NSLog(@"formattedDateString for locale %@: %@", [[dateFormatter locale] localeIdentifier], formattedDateString); 

在iOS8和更新版本中,您可以使用DateComponentsFormatter 。 下面是一个Swift 3的例子。

 let duration: NSTimeInterval = 86401 // 24:00:01 let formatter = DateComponentsFormatter() formatter.unitsStyle = .positional formatter.allowedUnits = [.hour, .minute, .second] formatter.zeroFormattingBehavior = [.pad] let formattedDuration = formatter.string(from: duration)