我正在尝试在两个小时之间进行一些计算。
我从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
。
我的问题是:
Date
中获得String
? String
中获得Date
? 编辑:
确切地说,我的目标是将一个时间值减去一个总时间值。我在Firebase上获得了700 H 50分钟的总体用户体验,如下所示:700:50。在另一部分中,我有一些特殊的经验,即1h 40min的射击时间是在火力发源地之前的1:40。
我的要求是从全局中减去特定经验。
700:50 - 1:40 = 699:10
根据我目前的Swift经验,我仅使用Date()
和DateFormatter
来处理时间,而且我不知道如何只处理时间而不处理日期...
希望您能通过我的编辑更好地理解这一点
答案 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)