Я пытаюсь преобразовать строку даты "2020-05-07T22:59:51Z"
в объект Date
, но безуспешно. Вот как я настроил свой DateFormatter
, но всегда получаю nil
:
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
formatter.timeZone = TimeZone(secondsFromGMT: 0)
Вдобавок я пробовал:
- Создание форматтера
static
- Изменение строки dateFormat на
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
, "yyyy-MM-dd'T'HH:mm:ssZ"
, "yyyy-MM-dd'T'HH:mm:ssZZZ"
, "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
- Следуя документации Apple для Работа с представлениями даты в фиксированном формате (by сначала заменив единственное вхождение
"Z"
на "-00:00"
в соответствии с форматом RF C 3339, например, "2020-05-07T22:59:51-00:00"
) - Покопайтесь в архивах документации Apple и следуйте инструкциям Разбор RF C 3339 дата-время пример
Вот фрагмент, в котором я использую средство форматирования даты выше, чтобы попытаться проанализировать "2020-05-07T22:59:51Z"
. dateString
не nil
, и это также происходит в основном потоке:
if let dateString = readASN1DateString(ptr: &dateStartPtr, maxLength: length) {
receiptCreationDate = Receipt.RFC3339DateFormatter.date(from: dateString)
}
Любые предложения относительно того, что я делаю неправильно?
EDIT Спасибо за ответ и комментарии, довольно забавно, когда я помещаю внутрь необработанную строку, она работает, но когда у меня есть строковая переменная с ТОЧНОЙ той же строкой, она возвращает nil. Вот пара изображений, показывающих то, что я вижу при отладке:
Step over print (...), Step over self.receiptCreationDate = ...
Журнал консоли после печати
self.receiptCreationDate = nil
значение dateString
Одно замечание заключается в том, что строка, возвращаемая readASN1DateString(...)
, инициализируется с использованием String(bytesNoCopy:, length:, encoding: .ascii, freeWhenDone: false)