首页 > 解决方案 > 从字符串到日期的 Swift 小时和分钟

问题描述

我试图在两个小时之间应用一些计算。

我从 Firebase 收到的字符串格式(HH:mm)的时间太长,我尝试将其转换为日期格式(HH:mm)。然后在再次转换为字符串之前应用计算并将其播种到 Firebase 中的存档中。

我的代码:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"

ref.child("Experience").child(userID!).observeSingleEvent(of: .value) {(snapshot) in
    if let value = snapshot.value as? [String:String]{
        let value = snapshot.value as? NSDictionary

        let total_time = value?["TOTAL_TIME"] as? String ?? "00:00" // Received from Firebase

        self.oldDateTotalTime = dateFormatter.date(from: total_time)! //trying to convert into a Date format
        print(self.oldDateTotalTime)

        self.oldStringTotalTime = total_time //just for test
    }

这段代码不起作用,因为我认为dateFormatter.

我的问题是:

  1. 我怎样才能得到我DateString
  2. 我怎样才能String从我那里得到我的Date

编辑:
为了准确我的问题,我的目标是从总时间值中减去一个时间值。我有一个完整的用户体验,即 700 H 50 分钟,在 Firebase 上给出如下:700:50。在另一部分,我有一些具体的经验,即 1 小时 40 分钟,在火力基地的 1:40 之前给出。
我的要求是从全局中减去特定的经验。

700:50 - 1:40 = 699:10

在我目前的 Swift 经验中,我只使用Date()&DateFormatter来处理时间,我不知道如何只处理时间而不是日期......

希望您能通过我的编辑更好地理解这一点

标签: swiftstringdatetype-conversion

解决方案


如果需要,这里是正则表达式代码;当然可以优化。

func stringToTime(_ timeStr: String) -> (Int, Int) {
    var hours = 0
    var minutes = 0
    let patternH = "[0-9]*[:]" // digits, followed by :
    let regexH = try! NSRegularExpression(pattern: patternH, options: .caseInsensitive)
    if let matchH = regexH.firstMatch(in: timeStr, range: NSRange(0..<timeStr.utf16.count)) {
        let hStr = String(timeStr[Range(matchH.range(at: 0), in: timeStr)!]).dropLast()
        hours = Int(hStr) ?? 0
        let patternM = "[:][0-9]{1,2}"  //  1 or 2 digits
        let regexM = try! NSRegularExpression(pattern: patternM, options: .caseInsensitive)
        if let matchM = regexM.firstMatch(in: timeStr, range: NSRange(0..<timeStr.utf16.count)) {
            let mStr = String(timeStr[Range(matchM.range(at: 0), in: timeStr)!]).dropFirst()
            minutes = Int(mStr) ?? 0
        }
    }

    return (hours, minutes)
}

let timeStr = "700:50"
let time1 = stringToTime("700:50")
let time2 = stringToTime("1:40")

var time = (time1.0 - time2.0, time1.1 - time2.1)
if time.1 < 0 {
    time.1 = time.1 + 60
    time.0 -= 1
}

print(time)

推荐阅读