Анализ строки даты rf c 3339 в формате yyyy-MM-dd'T'HH: mm: ss'Z 'возвращает ноль - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь преобразовать строку даты "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)

1 Ответ

0 голосов
/ 09 мая 2020

Я использую ваш код и получаю результат

override func viewDidLoad() {
    super.viewDidLoad()


  let formatter = DateFormatter()
  formatter.locale = Locale(identifier: "en_US_POSIX")
  formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"

    // Do any additional setup after loading the view.
  let isoDate = "2020-05-07T22:59:51Z"
  if let date = formatter.date(from:isoDate) {
   print(date)
  }

enter image description here

...