首页 > 解决方案 > 如何快速计算从现在到某个日期的天数、小时数、分钟数

问题描述

快速计算到另一个日期的天数、小时数、分钟数和秒数。

我已经尝试过使用 swifts datecomponents 往返函数,但它为我返回的天数不正确。

@objc func createCountdown(){
    let date = Date()
    let calendar = Calendar.current

    let components = calendar.dateComponents([.day, .hour, .minute, .second], from: date)

    let currentDate = calendar.date(from: components)

    let userCalendar = Calendar.current

    var birthdayDate = DateComponents()
    //Get user's birthday
    birthdayDate.month = 4
    birthdayDate.day = 16
    birthdayDate.hour = 0
    birthdayDate.minute = 0


    let birthday = userCalendar.date(from: birthdayDate as DateComponents)


    let BirthdayDifference = calendar.dateComponents([.day, .hour, .minute, .second], from: currentDate!, to: birthday!)

    let daysLeft = BirthdayDifference.day
    let hoursLeft = BirthdayDifference.hour
    let minutesLeft = BirthdayDifference.minute
    let secondsLeft = BirthdayDifference.second

    daysLabel.text = String(daysLeft!)
    hoursLabel.text = String(hoursLeft!)
    minutesLabel.text = String(minutesLeft!)
    secondsLabel.text = String(secondsLeft!)
}

代码中的测试日期是生日值。我只是想从当前日期开始对指定的生日进行一天、小时、分钟和秒的倒计时。

输出是 74 天,但显然从今天 2018 年 12 月 31 日到 2019 年 4 月 16 日 4 月 16 日超过 74 天。那是大约 105 天,而不是 74 天。非常感谢任何建议。

谢谢你。

标签: swift

解决方案


您需要根据生日的日期和月份找出下一个出生日期是什么时候。您可以使用日历的方法nextDate(after: Date, matching: DateComponents)

func nextDate(after date: Date, matching components: DateComponents, matchingPolicy: Calendar.MatchingPolicy, repeatedTimePolicy: Calendar.RepeatedTimePolicy = default, direction: Calendar.SearchDirection = default) -> Date?

let birthDateCoponents = DateComponents(month: 4, day: 16)
let nextBirthDate = Calendar.current.nextDate(after: Date(), matching: birthDateCoponents, matchingPolicy: .nextTime)!

let difference = Calendar.current.dateComponents([.day, .hour, .minute, .second], from: Date(), to: nextBirthDate)

difference.day     // 105
difference.hour    // 2
difference.minute  // 5
difference.second  // 30

当向用户显示它时,您可以将 DateComponentsFormatter 与适当的unitsStyle. 您可以在下面看到使用.full样式并将单位限制为时的外观.day, .hour, .minute, .second

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.day, .hour, .minute, .second]

formatter.unitsStyle = .full
formatter.string(from: Date(), to: nextBirthDate)  // "105 days, 1 hour, 44 minutes, 36 seconds"

推荐阅读