105

seconds特定のイベントから渡された量があります。NSTimeIntervalデータ型で格納されます。

と に変換しminutesたいseconds

たとえば、「326.4」秒があり、それを次の文字列「5:26」に変換したいとします。

この目標を達成するための最良の方法は何ですか?

ありがとう。

4

12 に答える 12

183

簡単な説明

  1. 分に変換したいだけの場合は、BrianRamsayからの回答の方が便利です。
  2. Cocoa APIが必要な場合は、それを実行して、NSTimeIntervalを分だけでなく、日、月、週などにも変換します。これは、より一般的なアプローチだと思います。
  3. NSCalendarメソッドを使用します。

    • (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

    • 「指定されたコンポーネントを使用するNSDateComponentsオブジェクトとして、指定された2つの日付の差を返します」。APIドキュメントから。

  4. 変換するNSTimeIntervalが異なる2つのNSDateを作成します。(NSTimeIntervalが2つのNSDateの比較から得られる場合は、この手順を実行する必要はなく、NSTimeIntervalも必要ありません)。

  5. 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];

既知の問題点

  • 変換だけでは多すぎるのは正しいですが、それがAPIの仕組みです。
  • 私の提案:NSDateとNSCalendarを使用して時間データを管理することに慣れている場合は、APIが大変な作業を行います。
于 2009-09-06T17:27:07.530 に答える
147

疑似コード:

minutes = floor(326.4/60)
seconds = round(326.4 - minutes * 60)
于 2009-07-27T16:42:36.593 に答える
43

これらはすべて、必要以上に複雑に見えます。時間間隔を時間、分、秒に変換するための短くて便利な方法を次に示します。

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 つに追加できます :-)

于 2013-03-08T23:04:32.660 に答える
29

スタック処女であることを許してください...ブライアン・ラムゼイの答えに返信する方法がわかりません...

59.5 ~ 59.99999 の間の秒の値では、四捨五入を使用できません。この期間中、2 番目の値は 60 になります。代わりに trunc を使用してください...

 double progress;

 int minutes = floor(progress/60);
 int seconds = trunc(progress - minutes * 60);
于 2010-11-12T21:39:19.063 に答える
17

ブライアン・ラムゼイのコード、疑似化解除:

- (NSString*)formattedStringForDuration:(NSTimeInterval)duration
{
    NSInteger minutes = floor(duration/60);
    NSInteger seconds = round(duration - minutes * 60);
    return [NSString stringWithFormat:@"%d:%02d", minutes, seconds];
}
于 2012-09-27T15:32:09.387 に答える
7

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")
于 2014-09-22T06:04:17.737 に答える
6
    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
于 2014-01-25T20:03:05.510 に答える
5

実質ダブルだから…

60.0 で割り、整数部分と小数部分を抽出します。

整数部分は分数の整数になります。

小数部分に 60.0 を再度掛けます。

結果は残りの秒数になります。

于 2009-07-27T16:49:38.017 に答える