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

时间:2010-11-05 20:04:01

标签: iphone ios

我需要在iPhone上以“hh:mm:ss”格式显示计时器,但希望它本地化。例如,芬兰在时间成分之间使用句号而不是冒号(hh.mm.ss)。如果我处理的是“时间”,那么Apple的NSDateFormatter可以解决这个问题,但我需要显示大于24的小时数。

我无法使NSDate / NSDateFormatter工作,因为当你用秒制作一个......

NSDate *aDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTotalSeconds];

...每隔86,400秒(一天的价值)NSDate自动递增日,小时,分钟和秒回零。我需要让它在任何数秒内工作而不会翻滚。例如,在86,401秒我希望显示24:00:01(或芬兰的24.00.01)。

我的代码管理总秒数,所以唯一的问题是显示。一个简单的......

[NSString stringWithFormat:@"%d%@%d%@%d", hours, sepString, mins, sepString, secs]
如果我能找到一种获得本地化“sepString”(时间组件分隔符)的方法,那么

...会有效。 NSLocale似乎没有这个。

思想?

5 个答案:

答案 0 :(得分:3)

这是一种公认​​的hackish方法,可以为任何语言环境获取时间组件分隔符。它应该适用于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];
}
//------------------------------------------------------------------------------

答案 1 :(得分:2)

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

使用句号,hh.mm

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

使用短划线,hh-mm

•马拉地语(印度){IN}

请注意,印度(不是马拉地语 - 印度)也有国家代码IN,它使用冒号。因此,只检查国家/地区代码是不够的,您将不得不查看其他NSLocale字段。我还没有浏览过所有字段,但我怀疑NSLocaleScriptCode或NSLocaleVariantCode可能会区分它们。这种复杂性是Apple为什么要在SDK中向我们公开这个角色的原因。我确实在Radar中记录了它,所以如果你同意请同意,请求的数量对他们决定的事情很重要。

答案 2 :(得分:0)

如果所有其他方法都失败了,请查看使用NSLocalizedString()或NSLocalizedStringWithDefaultValue。

答案 3 :(得分:0)

首先,您应该使用NSDateFormatter格式化日期。 Apple建议使用用户可在设置中自定义的内置样式。以下代码直接来自apple docs:

 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);

答案 4 :(得分:0)

在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)