如何将NSTimeInterval(秒)转换为分钟
我从某个事件中获得了大量的秒数。 它存储在NSTimeInterval数据types中。
我想把它转换成分钟和秒钟。
例如我有:“326.4”秒,我想把它转换成下面的string:“5:26”。
什么是达到这个目标的最好方法?
谢谢。
伪代码:
minutes = floor(326.4/60) seconds = round(326.4 - minutes * 60)
简要描述;简介
- 如果您只想转换为分钟,Brian Ramsay的答案会更方便。
- 如果你想Cocoa API为你做,并将你的NSTimeInterval不仅转换为分钟,而且还转换成日,月,周等…我认为这是一个更通用的方法
-
使用NSCalendar方法:
-
(NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
-
“作为使用指定组件的NSDateComponents对象返回两个提供的date之间的差异”。 从API文档。
-
-
创build2个NSDate,它们的区别是您要转换的NSTimeInterval。 (如果你的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];
已知的问题
- 太多只是一个转换,你是对的,但这就是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