Вам просто нужно получить день после первоначальной даты и вычесть секунду. Затем подсчитайте количество секунд в этой дате, используя метод календаря
func ordinality(of smaller: Calendar.Component, in larger: Calendar.Component, for date: Date) -> Int?
. С некоторыми помощниками вы можете упростить свою жизнь
extension Date {
var dayAfter: Date { Calendar.current.date(byAdding: .day, value: 1, to: noon)!}
var noon: Date { Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)! }
var startOfDay: Date { Calendar.current.startOfDay(for: self) }
var endOfDay: Date { Calendar.current.date(byAdding: .init(second: -1), to: dayAfter.startOfDay)! }
}
Тестирование endOfDay
Date().endOfDay // "Feb 7, 2020 at 11:59 PM"
И ваш метод:
func getTimeAsProportionOfDay(time: Date) -> Double {
// discarding the fractional seconds
let time = Calendar.current.date(bySetting: .nanosecond, value: 0, of: time)!
return Double(Calendar.current.ordinality(of: .second, in: .day, for: time)!-1) /
Double(Calendar.current.ordinality(of: .second, in: .day, for: time.endOfDay)!-1)
}
Тестирование игровой площадки:
let date = DateComponents(calendar: .current, year: 2020, month: 2, day: 7, hour: 23, minute: 08).date!
date.endOfDay
let result = getTimeAsProportionOfDay(time: date) // 0.9639000451394113