在 Swift 中获取两个日期之间的百分比作为浮点数

Qua*_*ees 1 date swift

所以我目前正在尝试添加一个功能,给定两个日期,它会告诉我我已经走了多远。

TLDR: 所以,假设我有一个日期 是 ,July 1st, 2017 20:00:00另一个日期是July 2nd, 2017 22:00:00,今天是July 2nd, 08:00:00,那么我将得到我已完成 46.17% 的结果。

我尝试这样做的方法是使用一个简单的公式:

进度=(当前时间-开始时间)/(结束时间-开始时间)

但是当放入代码中时,我可以减去两个日期,并得到差值DateComponent,但我不能除以两个DateComponent。这是我设置的代码,扩展名为 t

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

let startDate = formatter.date(from: "2017-07-01 20:00:00")
let endDate = formatter.date(from: "2017-07-02 22:00:00")
let currentDate = formatter.date(from: "2017-07-01 08:00:00")

let progress = (currentDate - startDate) / (endDate - startDate)



extension Date {
    static func - (date1: Date, date2: Date) -> DateComponents {
        let calender:Calendar = Calendar.current
        return calender.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date1, to: date2)
    }
}
Run Code Online (Sandbox Code Playgroud)

必须有一种方法来划分两个日期。但我想不到,我在网上找到的所有内容(使用不同的语言)都需要两个日期之间的划分。

我尝试将所有内容转换为秒,然后将其除以秒,但我不知道如何将秒转换回 a,DateComponent因为可能存在 5000 秒的差异。任何帮助表示赞赏!

Swe*_*per 6

您只需将日期转换为数字,因为这样您就可以对它们进行加法和减法。

您可以使用 将timeIntervalSince1970日期转换为数字,然后您可以使用您的公式:

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let startDate = formatter.date(from: "2017-07-01 20:00:00")!.timeIntervalSince1970
let endDate = formatter.date(from: "2017-07-02 22:00:00")!.timeIntervalSince1970
let currentDate = formatter.date(from: "2017-07-02 08:00:00")!.timeIntervalSince1970

let percentage = (currentDate - startDate) / (endDate - startDate)
Run Code Online (Sandbox Code Playgroud)

或者,使用timeIntervalSince(_:)

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let startDate = formatter.date(from: "2017-07-01 20:00:00")!
let duration = formatter.date(from: "2017-07-02 22:00:00")!.timeIntervalSince(startDate)
let elapsed = formatter.date(from: "2017-07-02 08:00:00")!.timeIntervalSince(startDate)

let percentage = elapsed / duration
Run Code Online (Sandbox Code Playgroud)

我认为这种方式更好,因为你得到的数学知识更少:)。