Реализовать отсчет от текущей даты
Подскажите, пожалуйста. Хочу реализовать отсчет лет, месяцев, дней, часов, минут и секунд от определенной даты до текущей. Этот отсчет хочу показывать в лейбле с обновлением в 1 секунду. К примеру : 2 года, 11 месяцев, 16 дней, 7 часов, 42 минут, 40 секунд
Реализовал такой код:
class CompletionTimeDifference {
static let shared = CompletionTimeDifference()
let date = NSDate()
let calendar = Calendar.current
func getDifference(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int) -> String {
let components = calendar.dateComponents([.hour, .minute, .second, .month, .year, .day], from: date as Date)
let currentDate = calendar.date(from: components)
let userCalendar = Calendar.current
let competitionDate = NSDateComponents()
competitionDate.year = year
competitionDate.month = month
competitionDate.day = day
competitionDate.hour = hour
competitionDate.minute = minute
competitionDate.second = second
let competition = userCalendar.date(from: competitionDate as DateComponents)!
let CompetitionDifference = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: currentDate!, to: competition)
let yearsLeft = (CompetitionDifference.year ?? 0) * -1
let monthsLeft = (CompetitionDifference.month ?? 0) * -1
let daysLeft = (CompetitionDifference.day ?? 0) * -1
let hoursLeft = (CompetitionDifference.hour ?? 0) * -1
let minutesLeft = (CompetitionDifference.minute ?? 0) * -1
let secondsLeft = (CompetitionDifference.second ?? 0) * -1
var years = "\(yearsLeft)"
var months = "\(monthsLeft)"
var days = "\(daysLeft)"
var hours = "\(hoursLeft)"
var minutes = "\(minutesLeft)"
var seconds = "\(secondsLeft)"
if yearsLeft.words.last == 1 {
years = years + " год"
}
else if yearsLeft.words.last == 2 || yearsLeft.words.last == 3 || yearsLeft.words.last == 4 {
years = years + " года"
} else {
years = years + " лет"
}
if monthsLeft.words.last == 1 {
months = months + " месяц"
}
else if monthsLeft.words.last == 2 || monthsLeft.words.last == 3 || monthsLeft.words.last == 4 {
months = months + " месяца"
} else {
months = months + " месяцев"
}
if daysLeft.words.last == 1 {
days = days + " день"
}
else if daysLeft.words.last == 2 || daysLeft.words.last == 3 || daysLeft.words.last == 4 {
days = days + " дня"
} else {
days = days + " дней"
}
if hoursLeft.words.last == 1 {
hours = hours + " час"
}
else if hoursLeft.words.last == 2 || hoursLeft.words.last == 3 || hoursLeft.words.last == 4 {
hours = hours + " часа"
} else {
hours = hours + " часов"
}
if minutesLeft.words.last == 1 {
minutes = minutes + " минута"
}
else if minutesLeft.words.last == 2 || minutesLeft.words.last == 3 || minutesLeft.words.last == 4 {
minutes = minutes + " минуты"
} else {
minutes = minutes + " минут"
}
if secondsLeft.words.last == 1 {
seconds = seconds + " секунда"
}
else if secondsLeft.words.last == 2 || secondsLeft.words.last == 3 || secondsLeft.words.last == 4 {
seconds = seconds + " секунды"
} else {
seconds = seconds + " секунд"
}
return "\(years), \(months), \(days), \(hours), \(minutes), \(seconds)"
}
Далее во вьюконтроллере через таймер пытаюсь вывести дату в лейбл, но у меня не обновляется он, а показывает только одну дату (как при единоразовом вызове функции)
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimeLabel), userInfo: nil, repeats: true)
@objc func updateTimeLabel() {
counterLabel.text = timeDifference.getDifference(year: 2020, month: 1, day: 1, hour: 9, minute: 0, second: 0)
}
Ответы (1 шт):
Автор решения: Oleg Soloviev
→ Ссылка
У вас не меняется переменная date, поэтому не происходит изменений в counterLabel.text. Вам нужно перенести
let date = NSDate()
в функцию getDifference, чтобы отсчет шел от текущих даты и времени.