В настоящее время я работаю над приложением для iOS и столкнулся с необычной проблемой с форматированием даты. Я использую следующий код Swift для создания отметки времени в определенном формате и регистрации ее в Google Analytics4:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSXXX"
let currentDate = Date()
let formattedDate = dateFormatter.string(from: currentDate) // 2024-04-20T21:23:42.22+09:00
Предполагается, что dateFormat, который я использую, форматирует текущую дату и время в формате ISO 8601. Однако, хотя ожидаемым поведением является получение текущего года (например, 2024), средство форматирования иногда возвращает такие годы, как 2567 или 0006.
Эти неверные данные о году спорадически появляются на разных пользовательских устройствах и не коррелируют с какой-либо конкретной версией iOS или моделью устройства. Большинство временных меток верны, но эти отклонения вызывают беспокойство.
Может ли кто-нибудь помочь мне понять, почему это может происходить? Что-то не так с тем, как я использую DateFormatter? Мы будем очень признательны за любые советы о том, как обеспечить правильное указание года.
Спасибо!
0006 год выглядит так, будто используется японский календарь, а 2567 год очень близок к этому году по буддийскому календарю. Как сказал Евгений, вам следует использовать ISO8601DateFormatter
Вам следует использовать средство форматирования даты в правильном языковом стандарте. В моем проекте есть расширение. Не могли бы вы попробовать использовать одно из следующих:
extension DateFormatter {
static let iso8601: ISO8601DateFormatter = {
let formatter = ISO8601DateFormatter()
return formatter
}()
static let iso8601Custom: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
formatter.calendar = Calendar(identifier: .gregorian)
return formatter
}()
}
Благодарим за ваше предложение! Я применил предоставленное вами расширение, и оно отлично решило мою проблему. Я действительно ценю твою помощь!
Привет, вы пробовали ISO8601DateFormatter? И я бы предложил вам использовать Date.now вместо Date().