如何本地化a";计时器“;在iPhone上

如何本地化a";计时器“;在iPhone上,iphone,ios,Iphone,Ios,我需要在iPhone上显示一个“hh:mm:ss”格式的计时器,但希望它本地化。例如,芬兰在时间组件(hh.mm.ss)之间使用句点而不是冒号。如果我处理的是“时间”,苹果的NSDateFormatter会起作用,但我需要显示比24小时大得多的小时数 我无法使NSDate/NSDateFormatter工作,因为当您用秒制作一个时 NSDate *aDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTotalSeconds]; 。。。

我需要在iPhone上显示一个“hh:mm:ss”格式的计时器,但希望它本地化。例如,芬兰在时间组件(hh.mm.ss)之间使用句点而不是冒号。如果我处理的是“时间”,苹果的NSDateFormatter会起作用,但我需要显示比24小时大得多的小时数

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

NSDate *aDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTotalSeconds];
。。。NSDate每86400秒(相当于一天)自动递增一天,小时、分钟和秒返回到零。我需要让它在任何秒数内工作,而不发生翻滚。例如,有86401秒,我想显示24:00:01(或芬兰的24.00.01)

我的代码可以很好地管理总秒数,所以我唯一的问题就是显示。一个简单的

[NSString stringWithFormat:@"%d%@%d%@%d", hours, sepString, mins, sepString, secs]
。。。如果我能找到一种方法来获取本地化的“sepString”(时间组件分隔符),那就行了。NSLocale似乎没有这个功能


想法?

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

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

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

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

使用句点hh.mm •丹麦(丹麦){DK}
•芬兰语(芬兰){FI}
•塞尔维亚-黑山(西里尔语){ME}
•塞尔维亚-黑山(拉丁语){ME}
•塞尔维亚语(西里尔语){RS}
•塞尔维亚语(拉丁语){RS}

使用破折号,hh-mm •马拉蒂(印度){IN}


请注意,印度(不是马拉地印度)也有国家代码,并且使用冒号。因此,仅仅检查国家代码是不够的,您必须查看其他NSLocale字段。我还没有浏览所有字段,但我怀疑NSLocalDescriptCode或NSLocaleVariantCode可能会区分它们。这种复杂性就是为什么苹果应该在SDK中向我们公开这个角色。我确实在雷达上记录了它,所以如果你同意的话,请也请求它,请求的数量对他们决定做什么很重要。

这里有一个公认的黑客方法,可以获得任何地区的时间组件分隔符。它应该在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];
}
//------------------------------------------------------------------------------

在iOS8和更新版本中,您可以使用。下面是一个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)

我不确定我是否理解这个问题,但您是否可以查找分组分隔符?它由
NSLocaleGroupingSeparator
键控。请参阅此处的
NSLocale
文档:@Justin:我认为分组分隔符是10^3个位置之间的标点符号,例如在美式英语中是123456789中的逗号。我不确定我是否理解
NSLocalizedString()
的相关性。同意,NSLocalizedString没有帮助。有趣的是,时钟应用程序中的Apple Timer函数不会更改分隔符以匹配区域设置。从我的角度来看,如果在框架中找不到解决方案,可以使用NSLocalizedString()作为分隔符。当然,它只是一个字符,但它会解决您的问题。这是一条路要走。在Localizable.strings文件中为格式字符串创建一个字符串,然后为要支持的每种语言创建格式字符串的版本。使用NSLocalizedString()获取用户当前语言的格式字符串的正确版本,并将该格式字符串作为第一个参数传递给+[NSString stringWithFormat:]。然后您将始终获得所需的格式。您不能使用NSLocalizedString来执行此操作。在iPhone上,它只适用于语言(不适用于地区)。日期格式差异与区域设置而不是语言有关。语言是英语(en)、法语(fr)等。地区是美国(US)、英国(GB)等。出于某种原因,“en-GB”中的字符串在iPhone上不起作用。即使它确实有效,也有超过240个地区,我想支持它们。这就是为什么苹果发明了NSLocale,我只是想看看我是否遗漏了什么,或者是否真的没有办法获得locale的时间组件分隔符。明白了,但我没有显示日期,也没有显示时间(0:00到23:59)。我正在显示小时、分钟和秒。简单地说,如果计时器运行了2天3小时4分钟5秒,我想显示51:04:05,我想使用用户区域设置中惯用的格式。我想我会将时间分隔符硬编码为冒号,然后使用它,再加上向苹果提交一个功能请求,以获取区域设置的时间组件分隔符。对不起,我应该把这个问题读得更清楚一点!在快速浏览了文档之后,我没有看到一种直接定位时间间隔的方法。假设DateFormatter确实使用了正确的分隔符字符,您可以使用它来确定您的区域设置的分隔符应该是什么。这有点可怕,但至少在iPhone上做了本地化设置。这是个好主意,谢谢。我检查过了,NSDateFormatter在iOS中正确地尊重了区域设置(region),因此我可以从其中获取字符。我认为使用NSDateFormatterShortStyle并解析第一个非数字字符的返回字符串将是最安全的“黑客”方法。即使苹果在SDK中添加了一种获取时间组件分隔符的方法,这也只适用于最新版本,我仍然需要一种适用于旧版本iOS的解决方案。