【问题标题】:Finding the difference between 2 times stored as strings in Swift 4在 Swift 4 中查找存储为字符串的 2 次之间的差异
【发布时间】:2018-03-22 23:14:35
【问题描述】:

我有 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)
}

【问题讨论】:

  • FWIW,我建议从您的 Swift 代码中删除 NSDate。使用Date 并仅在需要时桥接到NSDate
  • 顺便说一句,我也不喜欢计算属性从标签中提取值。这似乎将模型和视图混为一谈。

标签: swift date time swift4 intervals


【解决方案1】:

首先,您需要 Date 两个字符串的对象:

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
}

在哪里

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)
}

然后,如果你希望它是一个格式良好的字符串,你可以使用DateComponentsFormatter:

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

产量:

2:30

或者,如果你想要小时和分钟作为数值,你可以使用Calendar方法dateComponents(_:from:to:)

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

【讨论】:

  • 我想这段代码几乎可以在所有情况下工作,但我可以设想一些奇怪的边缘情况,你最终会得到两个日期,其中有一些闰秒或时间变化或最终给出错误的东西结果。由于字符串只是时间并且与日期无关,因此最好在没有DateFormatter 的情况下解析字符串。或者实际上DateFormatter 很好,理论上DateComponentsFormatter 可能会给出错误的结果。不过不确定是否值得。
  • 我同意。在没有日期的情况下解释时间的概念是危险的。例如,如果您在 NORAD 工作,并且要知道从凌晨 1:00 到早上 9:00 的轮班时间,那么 3 月 11 日的答案将不同于 3 月 12 日的答案。但是他使用了日期格式化程序,所以我不想打开那个蠕虫罐(除了用 Date 替换 NSDate 并鼓励他不要重复实例化格式化程序)。我的主要目标是向他展示如何从两个 Date 对象中获取经过的小时和分钟,无论是字符串还是数值。
  • 太好了,这对我有很大帮助我在控制台上打印了一个错误“无效时间字符串”可能是因为我的字符串包含日期和时间我使用的日期格式介质和时间格式首先从 UI 选择器视图创建字符串?
  • @rayray - 如果你有一个选择器视图,你应该从中获取Date 并完全绕过将其转换为字符串,然后再转换回Date
  • 我以为我有它,我现在有它显示总时间。但是阅读您上面的评论,我想我将不得不回到绘图板并更改我保存到 Realm 的方式,谢谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2015-04-16
相关资源
最近更新 更多