我需要在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似乎没有这个。
思想?
答案 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是花括号)。
•丹麦语(丹麦){DK}
•芬兰语(芬兰){FI}
•塞尔维亚黑山(西里尔文){ME}
•塞尔维亚黑山(拉丁语){ME}
•塞尔维亚语(西里尔语){RS}
•塞尔维亚语(拉丁语){RS}
•马拉地语(印度){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)