如何在swift中格式化用户显示(社交网络)的时间间隔?

时间:2016-03-14 22:07:46

标签: ios swift nsdate

我有一个时间间隔,比如12600,相当于3小时30分钟。我如何格式化任何这样的时间间隔,以便仅保留间隔的最高部分(例如,在这种情况下图中,小时)并且将正确的区域设置缩写附加到该数字。例如10米(10分钟),3d(3天),1年(1年)。

编辑:以下是一些例子:

Time interval in: 90000    Whole string: 1d      String out: 1d
Time interval in: 900      Whole string: 15m     String out: 15m
Time interval in: 13500    Whole String: 3h 45m  String out: 4h

作为一般规则,应用正常的舍入规则(3.4轮向下,3.6轮向上)。

6 个答案:

答案 0 :(得分:39)

使用自iOS 8以来可用的DateComponentFormatter

func format(duration: TimeInterval) -> String {
    let formatter = DateComponentsFormatter()
    formatter.allowedUnits = [.day, .hour, .minute, .second]
    formatter.unitsStyle = .abbreviated
    formatter.maximumUnitCount = 1

    return formatter.string(from: duration)!
}

for d in [12600.0, 90000.0, 900.0, 13500.0] {
    let str = format(duration: d)
    print("\(d): \(str)")
}

打印:

12600.0: 4h
90000.0: 1d
900.0: 15m
13500.0: 4h

答案 1 :(得分:11)

Swift 3 扩展程序:

extension TimeInterval {

  func format() -> String? {
    let formatter = DateComponentsFormatter()
    formatter.allowedUnits = [.day, .hour, .minute, .second, .nanosecond]
    formatter.unitsStyle = .abbreviated
    formatter.maximumUnitCount = 1
    return formatter.string(from: self)
  }
}

答案 2 :(得分:6)

万一有人想要它.. Swift 4

extension TimeInterval {
func format(using units: NSCalendar.Unit) -> String? {
    let formatter = DateComponentsFormatter()
    formatter.allowedUnits = units
    formatter.unitsStyle = .abbreviated
    formatter.zeroFormattingBehavior = .pad

    return formatter.string(from: self)
}}

使用示例:

let value:TimeInterval =  12600.0
print("\(value.format(using: [.hour, .minute, .second])!)")

,结果将是:

3h 30m 0s

答案 3 :(得分:1)

您可以使用NSDate和NSCalendar。你可以这样说:

let timeInterval:Double = 12600
let calendar = NSCalendar.currentCalendar()
let date = NSDate(timeInterval: -timeInterval, sinceDate: NSDate())
let components = calendar.components([.Year,.Day,.Hour, .Minute, .Second, .Nanosecond], fromDate: date, toDate: NSDate(), options: [])

let hour = components.hour //3
let minute = components.minute //30

Per duncan&rmaddy的建议使用NSDateComponentsFormatter

答案 4 :(得分:1)

看一下NSDateComponentsFormatter课程。它允许您使用2个日期或使用NSTimeInterval计算您想要的任何单位,并自动支持不同的语言和语言环境。在这里有关于这个主题的SO有几个帖子。

答案 5 :(得分:0)

我为你创造了一个功能!我希望你喜欢它。这非常容易实现,并且非常易于定制。

func totime(time: Double) -> (String) {

var timex = time

var fancytime: String = "a while"

if time < 61 {
    fancytime = "\(timex)s"
} else if time < 3601 {
    timex = timex/60
    timex = round(timex)
    fancytime = "\(timex)m"
} else if time < 86401 {
    timex = timex/3600
    timex = round(timex)
    fancytime = "\(timex)h"
} else if Double(time) < 3.15576E+07 {
    timex = timex/86400
    timex = round(timex)
    fancytime = "\(timex)d"
} else {
    fancytime = "more than one year"
}

fancytime = fancytime.stringByReplacingOccurrencesOfString(".0", withString: "")

return fancytime
}

经过测试,它完美无缺:

print(totime(90000)) // prints "1d"
print(totime(900)) // prints "15m"
print(totime(13500)) // prints "4h"

只需使用totime(Double)调用它。