seconds
特定のイベントから渡された量があります。NSTimeInterval
データ型で格納されます。
と に変換しminutes
たいseconds
。
たとえば、「326.4」秒があり、それを次の文字列「5:26」に変換したいとします。
この目標を達成するための最良の方法は何ですか?
ありがとう。
seconds
特定のイベントから渡された量があります。NSTimeInterval
データ型で格納されます。
と に変換しminutes
たいseconds
。
たとえば、「326.4」秒があり、それを次の文字列「5:26」に変換したいとします。
この目標を達成するための最良の方法は何ですか?
ありがとう。
簡単な説明
NSCalendarメソッドを使用します。
(NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
「指定されたコンポーネントを使用するNSDateComponentsオブジェクトとして、指定された2つの日付の差を返します」。APIドキュメントから。
変換するNSTimeIntervalが異なる2つのNSDateを作成します。(NSTimeIntervalが2つのNSDateの比較から得られる場合は、この手順を実行する必要はなく、NSTimeIntervalも必要ありません)。
NSDateComponentsから見積もりを取得します
サンプルコード
// The time interval
NSTimeInterval theTimeInterval = 326.4;
// Get the system calendar
NSCalendar *sysCalendar = [NSCalendar currentCalendar];
// Create the NSDates
NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1];
// Get conversion to months, days, hours, minutes
unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit;
NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1 toDate:date2 options:0];
NSLog(@"Conversion: %dmin %dhours %ddays %dmoths",[conversionInfo minute], [conversionInfo hour], [conversionInfo day], [conversionInfo month]);
[date1 release];
[date2 release];
既知の問題点
疑似コード:
minutes = floor(326.4/60)
seconds = round(326.4 - minutes * 60)
これらはすべて、必要以上に複雑に見えます。時間間隔を時間、分、秒に変換するための短くて便利な方法を次に示します。
NSTimeInterval timeInterval = 326.4;
long seconds = lroundf(timeInterval); // Since modulo operator (%) below needs int or long
int hour = seconds / 3600;
int mins = (seconds % 3600) / 60;
int secs = seconds % 60;
float を int に入れると、自動的に floor() が取得されますが、気分が良くなる場合は最初の 2 つに追加できます :-)
スタック処女であることを許してください...ブライアン・ラムゼイの答えに返信する方法がわかりません...
59.5 ~ 59.99999 の間の秒の値では、四捨五入を使用できません。この期間中、2 番目の値は 60 になります。代わりに trunc を使用してください...
double progress;
int minutes = floor(progress/60);
int seconds = trunc(progress - minutes * 60);
ブライアン・ラムゼイのコード、疑似化解除:
- (NSString*)formattedStringForDuration:(NSTimeInterval)duration
{
NSInteger minutes = floor(duration/60);
NSInteger seconds = round(duration - minutes * 60);
return [NSString stringWithFormat:@"%d:%02d", minutes, seconds];
}
Swift バージョンは次のとおりです。
func durationsBySecond(seconds s: Int) -> (days:Int,hours:Int,minutes:Int,seconds:Int) {
return (s / (24 * 3600),(s % (24 * 3600)) / 3600, s % 3600 / 60, s % 60)
}
次のように使用できます。
let (d,h,m,s) = durationsBySecond(seconds: duration)
println("time left: \(d) days \(h) hours \(m) minutes \(s) seconds")
NSDate *timeLater = [NSDate dateWithTimeIntervalSinceNow:60*90];
NSTimeInterval duration = [timeLater timeIntervalSinceNow];
NSInteger hours = floor(duration/(60*60));
NSInteger minutes = floor((duration/60) - hours * 60);
NSInteger seconds = floor(duration - (minutes * 60) - (hours * 60 * 60));
NSLog(@"timeLater: %@", [dateFormatter stringFromDate:timeLater]);
NSLog(@"time left: %d hours %d minutes %d seconds", hours,minutes,seconds);
出力:
timeLater: 22:27
timeLeft: 1 hours 29 minutes 59 seconds
実質ダブルだから…
60.0 で割り、整数部分と小数部分を抽出します。
整数部分は分数の整数になります。
小数部分に 60.0 を再度掛けます。
結果は残りの秒数になります。