当前位置: 首页 > 面试题库 >

在Swift中计算两个日期之间的时差

乜嘉悦
2023-03-14
问题内容

我已经看到了许多方法,如何根据特定的日期组件(例如,天,小时,月等)来计算两个日期之间的差异

Calendar.current.dateComponents([.hour], from: fromDate, to: toDate).hour
Calendar.current.dateComponents([.day], from: fromDate, to: toDate).day
Calendar.current.dateComponents([.month], from: fromDate, to: toDate).month

我还没有看到的是如何使用实际Date对象进行计算。就像是

func computeNewDate(from fromDate: Date, to toDate: Date) -> Date    
     let delta = toDate - fromDate
     let today = Date()
     if delta < 0 {
         return today
     } else {
         return today + delta
     }
}

我已经看到了 iOS 10中引入的类型,但是根据文档DateInterval

[it]不支持反向间隔,即持续时间小于0且结束日期在时间上早于开始日期的间隔。

这样就很难计算日期,尤其是当您不知道哪个是较早的日期时。

是否有任何干净整洁的方法可以直接计算s之间Date的时间差(并将它们Date再次添加到实例中)而无需使用它们进行计算timeIntervalSinceReferenceDate?


问题答案:

我最终为创建了一个自定义运算符Date:

extension Date {

    static func - (lhs: Date, rhs: Date) -> TimeInterval {
        return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate
    }

}

使用此运算符,我现在可以在更html" target="_blank">抽象的级别上计算两个日期之间的差,而无需关心timeIntervalSinceReferenceDate或确切地知道参考日期是什么,并且也不会损失精度,
例如:

let delta = toDate - fromDate

显然,我并没有做太多改变,但是对我来说,它更具可读性和结果:Swift +已经为a Date和a 实现了运算符TimeInterval:

/// Returns a `Date` with a specified amount of time added to it.
public static func + (lhs: Date, rhs: TimeInterval) -> Date

So it’s already supporting

Date + TimeInterval = Date

Consequently, it should also support

Date - Date = TimeInterval

我认为,这就是我对-操作符的简单实现所添加的内容。现在,我可以完全按照问题中的说明编写示例函数:

func computeNewDate(from fromDate: Date, to toDate: Date) -> Date    
     let delta = toDate - fromDate // `Date` - `Date` = `TimeInterval`
     let today = Date()
     if delta < 0 {
         return today
     } else {
         return today + delta // `Date` + `TimeInterval` = `Date`
     }
}

很可能这是我目前尚不了解的一些缺点,我很想听听您对此的想法。



 类似资料:
  • 问题内容: 我在-type字段中将上次登录时间存储在MySQL中。当用户登录时,我想获取上次登录时间与当前时间(我使用)之间的时差。 我该如何计算? 问题答案: 使用MySQL函数。例如,您可以使用: 在您的情况下,函数的第三个参数将是当前登录时间()。第二个参数是上次登录时间,该时间已在数据库中。

  • 本文向大家介绍java计算两个日期中间的时间,包括了java计算两个日期中间的时间的使用技巧和注意事项,需要的朋友参考一下 java计算两个日期中间的时间 其中在数据库中有一个字段为datetime类型,想要计算两个日期之间过了多少天 多少小时 多少分钟。 思路为把时间换算为毫秒(与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。然后利用毫秒的加减计算。 计算如下:

  • 问题内容: 我正在使用ES,并且我需要一个查询,该查询返回两个datetime(mysql timediff)之间的差,但是还没有找到ES的任何功能来做到这一点。有人可以帮助我吗? MySQL查询 谢谢! 问题答案: 最好的是脚本字段。如果您已启用动态脚本并且这些日期字段在映射中定义为日期,则上述搜索查询应该可以正常工作。 请注意,您将获得epoch的结果,您需要将其转换为面额。 您可以在此处阅读

  • 问题内容: 如何计算SQL Server中两个日期之间的工作日数? 星期一至星期五,它必须是T-SQL。 问题答案: 对于周一至周五的工作日,您可以使用单个SELECT进行操作,如下所示: 如果要包括假期,则必须进行一些调整…

  • 我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个

  • 防止日期保存时间出错 输入是两个对象(没有时间,我知道,但我需要使用实例来实现这一点)