【问题标题】:Calculating percentage between 2 Swift Date objects计算 2 个 Swift Date 对象之间的百分比
【发布时间】:2018-07-27 12:50:57
【问题描述】:

我有一个带有计时器的应用程序,它显示提醒的创建日期与结束日期之间的百分比。

我有 2 个参数(例如):

creationDate : 2018-02-16 17:06:10 UTC 'endDate' : 2018-02-16 15:07:09 UTC

计时器应显示 2 个Dates 之间经过了多少百分比。

我试过了:

let duration = self.creationDate.timeIntervalSince(self.endDate)
let timePassed = self.creationDate.timeIntervalSinceNow
let percent = (timePassed * 100) / duration

但我得到的信息不正确。

有人知道我的算法有什么问题吗?谢谢!

【问题讨论】:

  • 日期的百分比是多少??
  • @matt 自 2 个日期以来经过的时间
  • 那么这将涉及三个日期?开始、结束以及它们之间的某个时间点?
  • @matt 是的,当前日期
  • 您似乎走在正确的道路上,但“我得到的信息不正确” 没有建设性。这三个变量的值是多少?您期望什么?

标签: ios iphone swift algorithm cocoa-touch


【解决方案1】:

当我不得不写这样的东西时,我更喜欢变得更加愚蠢、乏味和系统化。这是一个演示。我们将计算我上一个生日和下一个生日之间的距离:

// initial conditions
let greg = Calendar(identifier: .gregorian)
let dc1 = DateComponents(calendar: greg, year: 2017, month: 8, day: 10)
let dc2 = DateComponents(calendar: greg, year: 2018, month: 8, day: 10)
let dstart = greg.date(from: dc1)!
let dend = greg.date(from: dc2)!
let target = Date() // now

// okay, ready to go! convert all dates to time intervals
let dend_ti = dend.timeIntervalSince(dstart)
let target_ti = target.timeIntervalSince(dstart)
// target is what percentage of dend?
let x = target_ti * 100 / dend_ti
// clamp between 0 and 100
let result = min(max(x, 0), 100)
// print result nicely
print(Int(result), "%", separator:"") // 52%

注意“夹紧”步骤;这将消除您的越界否定结果。

【讨论】:

    【解决方案2】:

    您的参考日期是 startDate 而不是 endDate:

    let duration = self.endDate.timeIntervalSince(self.creationDate)
    let timePassed = Date().timeIntervalSince(self.creationDate)
    let percent = (duration - timePassed) / duration * 100
    

    【讨论】:

    • 我得到percent=-5.1132038124672805creationDate=2018-02-16 17:36:55 UTCendDate=2018-02-16 15:42:48 UTC
    • 如果你的 endDate 是之前的 creationDate,那么百分比是负数,如果你想要百分比而不管那个条件,使用 abs() let percent = abs(duration - timePassed) / duration * 100跨度>
    【解决方案3】:

    我希望这会有所帮助(我从您的示例中重命名了创建/结束变量以使答案更清晰)

    let initialDate = Date().addingTimeInterval(-1000)
    let now = Date()
    let finalDate = Date().addingTimeInterval(10000)
    
    let totalDuration = finalDate.timeIntervalSince(initialDate)
    let currentRemainingDuration = finalDate.timeIntervalSince(now)
    
    let percent = (currentRemainingDuration/totalDuration) * 100
    

    另请注意,在您的示例中,日期结束日期早于创建日期。

    【讨论】:

    • 这是相同的计算,只是重命名的变量。
    • 感谢@MartinR 指出这一点。我只是从操场上复制粘贴的行,并没有重新检查。
    • 我得到 'percent = -4.65048592636217` 和 creationDate=2018-02-16 17:40:26 UTCendDate=2018-02-16 15:45:48 UTC
    • 得到那个负值是正常的,因为创建日期超过了结束日期......它就像一个计数器 10、9、8、7、6、5、4、3、2, 1、0、-1、-2……想象一下……你有 100 美元,花了 75 美元。剩余金额为 25%。你有 100 美元,花 100 美元。剩余金额为 0%。你有 100 美元,花费 125 美元。剩余金额将为-25%。与日期相同
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2021-12-11
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多