Если у вас возникли проблемы с определением форматеров даты, полезно использовать его для преобразования объекта Date
в String
(с помощью функции DateFormatter string(from:)
.) Записывать результаты, изучать их и использовать то, что вы видите, чтобы выяснить, чем форматер даты отличается от желаемого формата даты.
В вашем случае у вас есть DateFormatter, который использует формат "чч: мм а". Поэтому ему нужны часы, двоеточие, минуты и символ AM / PM, например, «12:23 вечера».
Принимая ваш код:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let dateString = dateFormatter.string(from: Date())
print(dateString)
И, запустив его на игровой площадке, мы получим вывод вроде:
05: 48 PM
Вы пытаетесь передать ей строку даты "77000". Вы говорите, что это «всего несколько секунд». Но ваш форматировщик даты не ожидает секунд. Ожидаются часы, минуты и символ AM / PM.
EDIT:
Я думаю, что нет способа конвертировать секунды в дату с помощью DateFormatter. Однако есть символ формата «А», который обозначает миллисекунды в день. Вы можете использовать это, но вам нужно умножить количество секунд на 1000.
Если вы хотите ввести дату в миллисекундах и преобразовать ее в часы, минуты и символ AM / PM, вам понадобится 2 средства форматирования даты: один для формата ввода и один для выходной формат. Ваш код может выглядеть так:
let inputFormatter = DateFormatter()
inputFormatter.dateFormat = "A"
let outputFormatter = DateFormatter()
outputFormatter.dateFormat = "hh:mm a"
outputFormatter.locale = Locale(identifier: "en_US_POSIX")
let dateString = outputFormatter.string(from: Date())
print(dateString)
guard let dateFromSeconds = inputFormatter.date(from: "77000000") else {
fatalError("Can't convert '77000000' to a date")
}
let displayString = DateFormatter.localizedString(from: dateFromSeconds, dateStyle: .medium, timeStyle: .medium)
print("displayString = \(displayString)")
Редактировать # 2:
Однако, если вы хотите добавить количество секунд к сегодняшнему полуночи, я предлагаю другой подход. Класс Calendar имеет целый набор методов, которые позволяют выполнять «Календарные вычисления». В этом случае мы будем использовать date(byAdding:value:to:wrappingComponents:)
.
Этот код может выглядеть так (все еще используя outputFormatter из кода выше):
let calendar = Calendar.current
let midnight = calendar.startOfDay(for: Date()) //Get the date of midnight today, local time
if let newDate = calendar.date(byAdding: .second, value: 77000, to: midnight) {
let output = outputFormatter.string(from: newDate)
print("date using Calendar.date(byAdding:value:to:wrappingComponents) = \(output)")
}
Что дает:
дата с использованием Calendar.date (byAdding: value: to: wrappingComponents) = 21:23