【问题标题】:Swift hour and minute from a string to a Date从字符串到日期的 Swift 小时和分钟
【发布时间】:2019-06-14 05:09:20
【问题描述】:

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

我从 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. 如何从我的String 获取我的Date
  2. 如何从我的Date 获取我的String

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

700:50 - 1:40 = 699:10

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

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

【问题讨论】:

  • 你的目标是什么?将诸如“14:30”之类的字符串转换为Date 对您意味着什么?你预计哪一天、哪一个月、哪一年?为什么要将时间字符串转换为日期?
  • 你指的是什么计算?您发布的代码仅尝试使用单个时间字符串。请edit您的问题并充分说明您要做什么以及遇到什么问题。不要用 cmets 回复。
  • didn't work 是什么意思?是否有任何错误被抛出?你的行为是什么?
  • 对于没有日期信息的时间计算DateComponents 更可取
  • 我已经编辑了我的请求,希望这对您来说更容易理解!

标签: swift string date type-conversion


【解决方案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)

【讨论】:

  • 这项工作完全如我所愿!结果 time 现在是 699, 10 但我怎样才能回到具有这种格式的字符串:699:10?
  • 好的,我只是了解如何获得像 699:10 这样的格式:String = "\(time.0):\(time.1)",这给了我格式的字符串!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
相关资源
最近更新 更多