【问题标题】:Get time difference between two times in swift 3在swift 3中获取两次之间的时间差
【发布时间】:2017-12-25 08:54:49
【问题描述】:

我有 2 个变量,我从 datePicker 获得了 2 次,我需要将它们之间的差异保存在一个变量中。

    let timeFormatter = DateFormatter()
    timeFormatter.dateFormat = "HHmm"

    time2 = timeFormatter.date(from: timeFormatter.string(from: datePicker.date))!

我试图从他们两个那里得到 timeIntervalSince1970,然后他们减去它们并得到毫秒的差异,我将返回到小时和分钟,但我得到一个非常大的数字,与实际时间不对应.

let dateTest = time2.timeIntervalSince1970 - time1.timeIntervalSince1970

然后我尝试使用 time2.timeIntervalSince(date: time1),但结果毫秒再次比实际时间多得多。

如何获得 2 次之间的正确时差并将结果以“0823”格式的小时和分钟表示 8 小时 23 分钟?

【问题讨论】:

    标签: swift3 nstimeinterval


    【解决方案1】:

    进行任何日期数学运算的推荐方法是CalendarDateComponents

    let difference = Calendar.current.dateComponents([.hour, .minute], from: time1, to: time2)
    let formattedString = String(format: "%02ld%02ld", difference.hour!, difference.minute!)
    print(formattedString)
    

    %02ld 格式添加了填充零。

    如果您需要在小时和分钟之间使用冒号的标准格式,DateComponentsFormatter() 可能是一种更方便的方式

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

    【讨论】:

    • 根据您的代码,time1time2 应该是 Date 实例。不需要日期格式化程序。
    • 当我使用代码执行此操作时,我得到以下不正确的打印输出:“fallAsleep: 2017-12-25 21:51:49 +0000, WakeUp: 2​​017-12-25 06:49 :55 +0000, 差值: 1501"
    • 但我刚刚注意到错误是因为它计算的是同一天。
    • 如果您使用的日期没有日期组件,则在 wake 中添加一天 if wake sleep
    • 好的,我已经添加了if timePicker.date <= fallAsleep { timePicker.date = timePicker.date.addingTimeInterval(+86400) },并且我在第二个日期添加了 24 小时来处理日差。
    【解决方案2】:

    TimeInterval 测量的是秒,而不是毫秒:

    let date1 = Date()
    let date2 = Date(timeIntervalSinceNow: 12600) // 3:30
    
    let diff = Int(date2.timeIntervalSince1970 - date1.timeIntervalSince1970)
    
    let hours = diff / 3600
    let minutes = (diff - hours * 3600) / 60
    

    【讨论】:

    • 为什么在这一行使用12600 let date2 = Date(timeIntervalSinceNow: 12600)
    • 这只是一个例子。
    【解决方案3】:

    要获得两个时间间隔之间的持续时间,可以使用 -

    let time1 = Date(timeIntervalSince1970: startTime)
    let time2 = Date(timeIntervalSince1970: endTime)
    let difference = Calendar.current.dateComponents([.second], from: time1, to: time2)
    let duration = difference.second
    

    【讨论】:

      【解决方案4】:

      现在你可以用这种方式在swift 5中做到这一点,

      func getDateDiff(start: Date, end: Date) -> Int  {
          let calendar = Calendar.current
          let dateComponents = calendar.dateComponents([Calendar.Component.second], from: start, to: end)
      
          let seconds = dateComponents.second
          return Int(seconds!)
      }
      

      【讨论】:

      • 这里需要导入哪个模块?我总是收到错误Use of undeclared type 'Seconds'
      • @linus_hologram 你可以用 Int 替换它
      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多