我见过许多方法如何根据特定的日期成分计算两个日期之间的差异,例如以天、小时、月等为单位(见this answer on Stackoverflow):

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且结束日期早于开始日期的间隔.

这就使得计算日期本身就很困难——尤其是当你不知道哪一个是较早的日期时.

Is there any clean and neat approach to compute time differences between 100s directly(并再次将它们添加到Date个实例中)without computing with their 102?

推荐答案

我最终创建了一个Date的自定义操作符:

extension Date {

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

}

有了这个操作符,我现在可以在更抽象的层面上计算两个日期之间的差异,而不必考虑timeIntervalSinceReferenceDate或参考日期的确切数字,也不必损失精度,例如:

let delta = toDate - fromDate

显然,我并没有做太多改变,但对我来说,它更具可读性,也更具结果性:Swift已经为DateTimeInterval实现了+操作符:

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

所以它已经在支持

Date + TimeInterval = Date

因此,它也应该支持

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

这很可能有一些我目前还没有意识到的缺点,我很想听听你们对此的看法.

Swift相关问答推荐

使用SWIFT宏从另一个枚举添加 case

如何为任务扩展的泛型静态函数获得自动类型推理

通常从数组调用的SWIFT静态协议函数

从SwiftUI使用UIPageView时,同一页面连续显示两次的问题

如何在应用程序区域永久更改 NSCursor?

Observable.create 捕获行为

OSX 中的 Popover 无法确定透明度

UIImage和UIimage.pngData返回两个不同的图像

Swift 全局函数列表

使用列表的下一项更新相同的视图

将阻塞函数集成到 Swift 异步中

不要从 NumberFormatter 获取货币符号

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

UnkeyedEncodingContainer 和 KeyedEncodingContainerProtocol 中的 superEncoder 是什么?

如何防止 UITableViewCell 移动(Swift 5)

如何在 SwiftUI 中实现 PageView?

Swift 覆盖实例变量

如何使用 Swift 将文本文件逐行加载到数组中?

Swift UITableView reloadData 在一个闭包中

如何在swift中的每N个字符处为字符串添加分隔符?