将小时和分钟从字符串快速转换为日期

时间:2019-01-20 18:00:05

标签: swift string date type-conversion

我正在尝试在两个小时之间进行一些计算。

我从firebase收到了我太小时的String格式(HH:mm),然后尝试将其转换为Date格式(HH:mm)。然后,在再次转换为字符串并将其播种到Firebase中的存档之前,应用calcul。

我的代码:

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. 如何从Date中获得String
  2. 如何从String中获得Date

编辑:
确切地说,我的目标是将一个时间值减去一个总时间值。我在Firebase上获得了700 H 50分钟的总体用户体验,如下所示:700:50。在另一部分中,我有一些特殊的经验,即1h 40min的射击时间是在火力发源地之前的1:40。 我的要求是从全局中减去特定经验。

700:50 - 1:40 = 699:10

根据我目前的Swift经验,我仅使用Date()DateFormatter来处理时间,而且我不知道如何只处理时间而不处理日期...

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

1 个答案:

答案 0 :(得分:1)

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

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)