我有一定数量的 seconds 是从某个事件过去的。它存储在一个 NSTimeInterval 数据类型。

我想把它转换成 minutesseconds.

例如我有:“326.4”秒,我想将其转换为以下字符串:“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 对象,返回两个提供的日期之间的差异”。来自 API 文档。

  4. 创建2个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 的工作原理。
  • 我的建议:如果您习惯使用 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,你地板()自动,但你可以把它添加到前两个如果要是让你感觉更好: - )

请原谅我堆栈处女......我不知道如何回答布莱恩·拉姆齐的答案......

使用圆不会为59.5和59.99999之间第二值工作。该第二值将是60,在此期间。使用TRUNC,而不是...

 double progress;

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

如果你在以上的iOS 8或OS X 10.10目标,这只是变得简单得多了。新NSDateComponentsFormatter类,可以在几秒钟内从它的价值给定NSTimeInterval转换为本地化的字符串显示给用户。例如:

目标-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的一个实例,或两个NSDate对象,可以做,以及通过下面的方法。

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

这里的一个版本夫特:

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世纪......

不要自己做数学(Swift 4)

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

5:26


图书馆的杠杆作用

如果您确实想要单独的组件和易于阅读的代码,请查看 快速日期:

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

5


致谢 @米克麦克卡勒姆@极地战争 为了充分利用 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