NSTimeIntervalが200.0に設定されている場合、それを00:03:20に変換する方法はありますか?それを使用してNSDateを初期化し、HH:mm:ssを使用してNSDateFormatterを使用できると考えていました。私の質問は、これを行う簡単な方法はあります[NSString stringWithFormat: %02d:%02d:%02d, myHour, myMin, mySec]
か、それとも自分で番号を分割して使用する必要がありますか?
回答:
NSDateFormatter
除算とモジュロ以外のものを使用する必要はありません。NSTimeInterval
秒を含む単なるdoubleです。
迅速
func stringFromTimeInterval(interval: NSTimeInterval) -> String {
let interval = Int(interval)
let seconds = interval % 60
let minutes = (interval / 60) % 60
let hours = (interval / 3600)
return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
Objective-C
- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {
NSInteger ti = (NSInteger)interval;
NSInteger seconds = ti % 60;
NSInteger minutes = (ti / 60) % 60;
NSInteger hours = (ti / 3600);
return [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds];
}
NSDateComponentsFormatter().stringFromTimeInterval(NSTimeInterval(duration))
、swift
iOS 8では、を使用しますNSDateComponentsFormatter
。
NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
「3:20」を出力します。
NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
「0:03:20」を出力します。
スウィフト3のバージョンonmyway133の答え:
import Foundation
func format(_ duration: TimeInterval) -> String {
let formatter = DateComponentsFormatter()
formatter.zeroFormattingBehavior = .pad
formatter.allowedUnits = [.minute, .second]
if duration >= 3600 {
formatter.allowedUnits.insert(.hour)
}
return formatter.string(from: duration)!
}
print(format(12)) // 0:12
print(format(65)) // 1:05
print(format(1750)) // 29:10
print(format(3890)) // 1:04:50
print(format(45720)) // 12:42:00
zeroFormattingBehavior
ように[.dropLeading, .pad]
、より良い(より少ないコード)オプションであるかもしれません。
いくつかの余分なコード行がありますが、NSDateComponentsを使用するとより正確な値が得られると思います。
- (NSString *)getTimeRepresentationFromDate:(NSDate *)iDate withTimeInterval:(NSTimeInterval)iTimeInterval {
NSString *aReturnValue = nil;
NSDate *aNewDate = [iDate dateByAddingTimeInterval:iTimeInterval];
unsigned int theUnits = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSCalendar *aCalender = [NSCalendar currentCalendar];
NSDateComponents *aDateComponents = [aCalender components:theUnits fromDate:iDate toDate:aNewDate options:0];
aReturnValue = [NSString stringWithFormat:@"%d:%d:%d", [aDateComponents hour], [aDateComponents minute], [aDateComponents second]];
return aReturnValue;
}
ではスウィフト2、iOSの8+。これにより、必要な場合にのみ時間を表示するようになります
func format(duration: NSTimeInterval) -> String {
let formatter = NSDateComponentsFormatter()
formatter.zeroFormattingBehavior = .Pad
if duration >= 3600 {
formatter.allowedUnits = [.Hour, .Minute, .Second]
} else {
formatter.allowedUnits = [.Minute, .Second]
}
return formatter.stringFromTimeInterval(duration) ?? ""
}
だからあなたは持っています
print(format(12)) // 0:12
print(format(65)) // 1:05
print(format(1750)) // 29:10
print(format(3890)) // 1:04:50
print(format(45720)) // 12:42:00
NSTimeInterval ti = 3667;
double hours = floor(ti / 60 / 60);
double minutes = floor((ti - (hours * 60 * 60)) / 60);
double seconds = floor(ti - (hours * 60 * 60) - (minutes * 60));
Matthias Bauchの提案を「拡張」するために、SwiftではこれをNSTimeIntervalの計算されたプロパティにします。
extension NSTimeInterval {
var stringValue: String {
let interval = Int(self)
let seconds = interval % 60
let minutes = (interval / 60) % 60
let hours = (interval / 3600)
return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
}
これの利点はNSTimeInterval
、View Controllerやその他の関数を配置する場所ではなく、型にアタッチされることです。使用するには、次のようになります。
let timeInterval = NSDate().timeIntervalSinceDate(start)
self.elapsedTimeLabel.text = timeInterval.stringValue
@ onmyway133の回答に基づいて、Swift4バージョンを次に示します。
func format(duration: TimeInterval) -> String {
let formatter = DateComponentsFormatter()
formatter.zeroFormattingBehavior = .pad
if duration >= 3600 {
formatter.allowedUnits = [.hour, .minute, .second];
} else {
formatter.allowedUnits = [.minute, .second];
}
return formatter.string(from: duration) ?? "";
}
アップルのドキュメントから直接:hファイル内:
@property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter;
mファイルで
@synthesize timerFormatter;
- (void)viewDidLoad {
[super viewDidLoad];
NSDateComponentsFormatter *timerFormatter = [[NSDateComponentsFormatter alloc] init];
timerFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
//10:59 Positional THIS ONE DOES NOT SEEM TO WORK iOS<9 WHEN <1Minute JUST SHOWS 01, 10m 59s Abbreviated, 10min 59sec Short, 10minutes 59seconds Full ...
timerFormatter.allowedUnits = NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
}
NSTimeInterval timeIntervalをhh:mm:ss文字列に変換する必要がある場合は、次のようにします。
NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];
私は、タイマーの端数を排除する必要があると思います。Matthiasのコードが数秒でその問題を作成していたので、Matthiasのコードから少し変更した次のものを使用します
- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {
int ti = (int) ceil(interval);
int seconds = ti % 60;
int minutes = (ti / 60) % 60;
int hours = (ti / 3600);
return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds];
}
onmyway133の回答のObjectiveCバージョン
- (NSString*) formatTimeInterval:(NSTimeInterval) timeInterval {
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
if (timeInterval > 3600) {
formatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
} else {
formatter.allowedUnits = NSCalendarUnitMinute | NSCalendarUnitSecond;
}
return [formatter stringFromTimeInterval:timeInterval];
}