質問

私た金額の seconds ることから特定のイベントです。で保存 NSTimeInterval データ型になります。

たいへ minutesseconds.

例えば私は:"326.4"秒、たいへ下記の文字列は:"5:26".

何を実現する最善の方法は、あなたのこを目標としていますか。

感謝。

役に立ちましたか?

解決

擬似コード

minutes = floor(326.4/60)
seconds = round(326.4 - minutes * 60)

他のヒント

簡単な説明

  1. するためのブライアン-ラムゼイはより便利にしている場合、変換したい分"の設定ができます。
  2. したい場合はココアAPIでき換されたNSTimeIntervalな分も日、月、週、...こういうアプローチがますます重要になっていく。
  3. 利用NSCalendar方法

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

    • "を返します、NSDateComponentsオブジェクトを指定した部品は納入日に".からのAPIドキュメント。

  4. を2NSDateその違いは、NSTimeIntervalいます。使用した場合は、NSTimeIntervalからの比較2NSDateんだこの段階で、必要な時に必要なだけの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います。

これらのすべては、彼らがする必要以上に複雑に見えます!ここで時間、分、秒に時間間隔を変換するために、短いと甘い方法があります:

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;

あなたがintにfloatを置くとき、あなたは自動的に)(床を取得しますが、あなたは良い感じになりますかの場合は、最初の二つに追加することができます: - )

スタック処女であるために私を許して...私はブライアン・ラムゼイの答えに返信するかどうかはわかりません...

ラウンドを使用すると、59.5と59.99999間の第二の値のために動作しません。 2番目の値は、この期間中に60になります。代わりに、TRUNC使用して...

 double progress;

 int minutes = floor(progress/60);
 int seconds = trunc(progress - minutes * 60);

あなたがでまたはiOS 8またはOS X 10.10を超えるターゲットにしている場合、これはちょうどたくさん簡単になりました。新しいNSDateComponentsFormatterクラスを使用すると、ユーザーを表示するためにローカライズされた文字列に秒単位で、その値から与えられたNSTimeIntervalに変換することができます。たとえばます:

のObjective-C

NSTimeInterval interval = 326.4;

NSDateComponentsFormatter *componentFormatter = [[NSDateComponentsFormatter alloc] init];

componentFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
componentFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropAll;

NSString *formattedString = [componentFormatter stringFromTimeInterval:interval];
NSLog(@"%@",formattedString); // 5:26

スウィフト

let interval = 326.4

let componentFormatter = NSDateComponentsFormatter()

componentFormatter.unitsStyle = .Positional
componentFormatter.zeroFormattingBehavior = .DropAll

if let formattedString = componentFormatter.stringFromTimeInterval(interval) {
    print(formattedString) // 5:26
}
この出力は長くなる形であるために、

NSDateCompnentsFormatterもできます。詳細情報はNSHipsterの NSFormatterの記事の中に見つけることができます。そして、あなたはまだ(NSTimeIntervalない場合)で作業しているどのクラスに応じて、フォーマッタにNSDateComponentsのインスタンス、または以下の方法によっても同様に行うことができる2つのNSDateオブジェクトを、合格する方が便利かもしれません。

のObjective-C

NSString *formattedString = [componentFormatter stringFromDate:<#(NSDate *)#> toDate:<#(NSDate *)#>];
NSString *formattedString = [componentFormatter stringFromDateComponents:<#(NSDateComponents *)#>];

スウィフト

if let formattedString = componentFormatter.stringFromDate(<#T##startDate: NSDate##NSDate#>, toDate: <#T##NSDate#>) {
    // ...
}

if let formattedString = componentFormatter.stringFromDateComponents(<#T##components: NSDateComponents##NSDateComponents#>) {
    // ...
}

ブライアン・ラムゼイのコード、デpseudofiedます:

- (NSString*)formattedStringForDuration:(NSTimeInterval)duration
{
    NSInteger minutes = floor(duration/60);
    NSInteger seconds = round(duration - minutes * 60);
    return [NSString stringWithFormat:@"%d:%02d", minutes, seconds];
}

ここでスウィフトバージョンです

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で小数部を乗算します。

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

この質問文字列出力、擬似コードまたは個々の文字列。

たいへ下記の文字列は:"5:26"

多くの回答の国際化の問題は、もっ算引き算など余計な計算は計算によります。すべてについての注意をお読みくだ20世紀の...

せんの数学(早4)

let timeInterval: TimeInterval = 326.4
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.unitsStyle = .positional
if let formatted = dateComponentsFormatter.string(from: timeInterval) {
    print(formatted)
}

5:26


レバレッジ図書館

また、個別のコンポーネント、快コードを読み、チェックアウト SwiftDate:

import SwiftDate
...
if let minutes = Int(timeInterval).seconds.in(.minute) {
    print("\(minutes)")
}

5


単位 @mickmaccallum@polarwar のための適切な利用 DateComponentsFormatter

私は(「1時23分」として、それを表示するように書式設定文字列を含む)スウィフトでこれをどうやってます:

let totalSeconds: Double = someTimeInterval
let minutes = Int(floor(totalSeconds / 60))
let seconds = Int(round(totalSeconds % 60))        
let timeString = String(format: "%02d:%02d", minutes, seconds)
NSLog(timeString)

スイフト2バージョン

extension NSTimeInterval {
            func toMM_SS() -> String {
                let interval = self
                let componentFormatter = NSDateComponentsFormatter()

                componentFormatter.unitsStyle = .Positional
                componentFormatter.zeroFormattingBehavior = .Pad
                componentFormatter.allowedUnits = [.Minute, .Second]
                return componentFormatter.stringFromTimeInterval(interval) ?? ""
            }
        }
    let duration = 326.4.toMM_SS()
    print(duration)    //"5:26"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top