Pertanyaan NSTimeInterval ke HH: mm: ss?


Jika saya memiliki NSTimeInterval yang diatur untuk mengatakan 200,0, apakah ada cara untuk mengubahnya menjadi 00:03:20, saya berpikir saya bisa menginisialisasi NSDate dengan itu dan kemudian menggunakan NSDateFormatter menggunakan HH: mm: ss. Pertanyaan saya adalah, apakah ada cara cepat untuk melakukan ini atau saya harus memecah nomor itu sendiri dan menggunakannya [NSString stringWithFormat: %02d:%02d:%02d, myHour, myMin, mySec]?


74
2018-02-08 12:36


asal


Jawaban:


Tidak perlu digunakan NSDateFormatter atau apa pun selain pembagian dan modulo. NSTimeInterval hanya dua detik yang mengandung.

Cepat

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];
}

189
2018-02-08 12:42



Pada iOS 8, gunakan NSDateComponentsFormatter.

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);

output "3:20".

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);

keluaran "0:03:20".


88
2017-10-02 14:38



Swift 3 versi dari onmyway133jawaban:

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

14
2017-10-29 16:36



Beberapa baris kode tambahan, tetapi saya merasa menggunakan NSDateComponents akan memberikan nilai yang lebih tepat.

- (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;
}

10
2017-11-13 10:27



Di Swift 2, iOS 8+. Ini memastikan kami hanya menampilkan jam jika diperlukan

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) ?? ""
}

Jadi kamu punya

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

6
2017-08-30 13:04



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));

5
2017-11-06 00:20



Untuk "memperpanjang" saran Matthias Bauch, di Swift saya akan membuat ini properti terhitung dari 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)
  }
}

Keuntungan dari ini adalah itu melekat pada NSTimeInterval ketik, bukan pengontrol tampilan Anda atau di mana pun Anda meletakkan fungsi itu. Untuk menggunakan Anda akan pergi sesuatu seperti:

let timeInterval = NSDate().timeIntervalSinceDate(start)        
self.elapsedTimeLabel.text = timeInterval.stringValue

4
2017-11-25 01:41



Berdasarkan jawaban oleh @ onmyway133 di sini adalah versi Swift 4:

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) ?? "";
}

0
2018-02-05 07:09



langsung dari dokumen apple: dalam file h:

 @property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter;

dalam file 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;
}

dimanapun Anda perlu mengubah NSTimeInterval timeInterval Anda ke hh: mm: string ss, lakukan ini:

NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];

0
2018-03-06 20:46



Saya kira, fraksi pengatur waktu harus dihentikan. Karena kode Matthias menciptakan masalah itu dalam hitungan detik, saya menggunakan beberapa hal yang sedikit dimodifikasi dari 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];
    }

0
2018-03-08 04:29