找到在Swift 4中存储为字符串的2次之间的差异

时间:2018-03-22 23:14:35

标签: swift date time swift4 intervals

我有2次存储为字符串,我试图找到它们之间的小时和分钟差异并将其显示在标签中,我很确定我必须使用DateFormatter从字符串中获取日期但从那时起,我迷失了最好的方式来获得差异,我读过的一些东西说使用间隔,其他人说使用日历。我似乎无法想出任何对我来说很清楚的事情。

var dailyTimeOut: NSDate {
    get{
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        return formatter.date(from: finishTimeLabel.text!)! as NSDate
    }
}

func calculateHours() {

    let interval = dailyTimeOut.timeIntervalSince(dailyTimeIn as Date)
    // print("\(stringFromTimeInterval(interval: interval))")

    let totalTime = stringFromTimeInterval(interval: interval)

    totalTimeLabel.text = totalTime
}

func stringFromTimeInterval(interval: TimeInterval) -> String {
    let interval = Int(interval)
    let minutes = (interval / 60) % 60
    let hours = (interval / 3600)
    return String(format: "%02d:%02d", hours, minutes)
}

1 个答案:

答案 0 :(得分:1)

First, you want Date objects for your two strings:

let string1 = "13:00"
let string2 = "15:30"

guard let time1 = time(from: string1), let time2 = time(from: string2) else {
    print("not valid time strings")
    return
}

Where

private let timeFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    return formatter
}()

private func time(from timeString: String) -> Date? {
    return timeFormatter.date(from: timeString)
}

Then, if you want it as a nicely formatted string, you can use DateComponentsFormatter:

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute]
let string = formatter.string(from: time1, to: time2)!

Yielding:

2:30

Or, if you want the hour and minute as numerical values, you can use Calendar method dateComponents(_:from:to:):

let components = Calendar.current.dateComponents([.hour, .minute], from: time1, to: time2)
let hour = components.hour!
let minutes = components.minute!