如何将NSTimeInterval(秒)转换为分钟

我从某个事件中获得了大量的秒数。 它存储在NSTimeInterval数据types中。

我想把它转换成分钟和秒钟。

例如我有:“326.4”秒,我想把它转换成下面的string:“5:26”。

什么是达到这个目标的最好方法?

谢谢。

伪代码:

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

简要描述;简介

  1. 如果您只想转换为分钟,Brian Ramsay的答案会更方便。
  2. 如果你想Cocoa API为你做,并将你的NSTimeInterval不仅转换为分钟,而且还转换成日,月,周等…我认为这是一个更通用的方法
  3. 使用NSCalendar方法:

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

    • “作为使用指定组件的NSDateComponents对象返回两个提供的date之间的差异”。 从API文档。

  4. 创build2个NSDate,它们的区别是您要转换的NSTimeInterval。 (如果你的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的工作原理。
  • 我的build议是:如果你习惯于使用NSDate和NSCalendar来pipe理你的时间数据,那么这个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; 

注意当你把一个float赋给int时,你会自动得到floor(),但是如果让你感觉更好的话,你可以把它添加到前两个:-)

原谅我是一个堆栈处女…我不知道如何回复布赖恩拉姆齐的答案…

对于59.5和59.99999之间的第二个值,使用round将不起作用。 第二个值是60。 改用trunc …

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

如果您的目标是iOS 8或OS X 10.10或更高版本,那么这会变得更容易。 新的NSDateComponentsFormatter类允许您将给定的NSTimeInterval从它的值(秒)转换为本地化的string以显示用户。 例如:

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也允许这个输出是更长的forms。 更多信息可以在NSHipster的NSFormatter文章中find 。 取决于你已经在使用什么类(如果不是NSTimeInterval ),将格式化器传递给NSDateComponents的实例或两个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#>) { // ... } 

布赖恩拉姆齐的代码,de-pseudofied:

 - (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的小数部分。

结果将是剩下的秒数。

我如何在Swift中做到这一点(包括string格式显示为“01: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) 

Swift 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" 

请记住,原来的问题是关于一个string输出,而不是伪代码或单个string组件。

我想把它转换成下面的string:“5:26”

许多答案都缺less国际化问题,大多数人都是手工进行math计算。 所有只是如此的20世纪…

不要自己做math(斯威夫特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)") } 


为了充分使用DateComponentsFormatter ,请致信 @mickmaccallum和DateComponentsFormatter