swift - 如何快速计算从现在到某个日期的天数、小时数、分钟数
问题描述
快速计算到另一个日期的天数、小时数、分钟数和秒数。
我已经尝试过使用 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 天。非常感谢任何建议。
谢谢你。
解决方案
您需要根据生日的日期和月份找出下一个出生日期是什么时候。您可以使用日历的方法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"
推荐阅读
- json - 使用包含 JSON 的富文本字段发布平台事件
- google-cloud-platform - Google Cloud API 从机器映像创建实例
- android - fdsan_error(char const*, ...) android 工作室 (kotlin)
- java - 在将字符串传递到日期时,它显示错误 java.sql.SQLException: ORA-00917: missing comma
- android - 在 Kotlin 上按下按钮时如何停止录制 AudioRecord
- java - 如何使用 OR 和使用 Cucumber 运行多个标签
- javascript - 从 url discord.js v13 播放音频
- javascript - 是否可以加载所有功能正常工作的 html 文件?
- html - 为什么我的元标记不起作用(手动上传单个 HTML 文件)?
- linux - 编译库 fortran libgmxfort (pkgconfig) 时出错