Быстрое преобразование времени строки в дату

#swift

#swift

Вопрос:

У меня есть json из rest API :

 {
  "status": "ok",
  "query": {
    "format": "json",
    "kota": "703",
    "tanggal": "2017-02-07"
  },
  "jadwal": {
    "status": "ok",
    "data": {
      "ashar": "15:26",
      "dhuha": "06:21",
      "dzuhur": "12:10",
      "imsak": "04:28",
      "isya": "19:31",
      "maghrib": "18:20",
      "subuh": "04:38",
      "tanggal": "Selasa, 07 Feb 2017",
      "terbit": "05:54"
    }
  }
}
 

Я хочу преобразовать jadwal -> data -> ashar и другие в формат даты
У меня есть этот код,

 extension String {
    func convertToDate() -> Date? {
        let arr = self.split(separator: ":")
        guard
            let hour = Int(arr.first ?? ""),
            let minute = Int(arr.last ?? "")
        else { return nil }
        
        let component = DateComponents(hour: hour, minute: minute)
        var cal = Calendar.current
        guard let timezone = TimeZone(identifier: "Asia/Jakarta") else { return nil }
        cal.timeZone = timezone
        let date = cal.date(from: component)
        return date
    }
}
 

Но я получаю этот результат при отладке моей консоли

 ashar: 0001-01-01 08:27:48  0000
 

я ожидаю, например, в asr / ashar = 2021-01-12 15:26:00 по индонезийскому времени, у вас, ребята, есть совет или что-то в этом роде?

Комментарии:

1. Пожалуйста, укажите, что вы подразумеваете под «хорошей работой». Кроме того, пожалуйста, опубликуйте, что вы получаете и чего ожидаете.

2. я отредактировал, пожалуйста, проверьте еще раз @ewong

3. Вы ожидаете , что дата будет сегодняшней, поэтому даты в JSON не имеют значения?

4. дата json просто фиктивный json, в productionn он должен быть 2021-01-12, а дата в json не используется в моем коде @vadian

5. Известно ли вам, что при печати объекта date он будет отображаться в часовом поясе UTC (следовательно, 0000 в конце)? Чтобы распечатать его в местном часовом поясе, используйте print(date.description(with: .current))

Ответ №1:

Вы можете создать расширение для string, которое возвращает объект с полной датой, передав только строку времени следующим образом.

 extension String {
    func createDateObjectWithTime(format: String = "HH:mm") -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        guard let dateObjectWithTime = dateFormatter.date(from: self) else { return nil }
        
        let gregorian = Calendar(identifier: .gregorian)
        let now = Date()
        let components: Set<Calendar.Component> = [.year, .month, .day, .hour, .minute, .second]
        var dateComponents = gregorian.dateComponents(components, from: now)

        let calendar = Calendar.current
        dateComponents.hour = calendar.component(.hour, from: dateObjectWithTime)
        dateComponents.minute = calendar.component(.minute, from: dateObjectWithTime)
        dateComponents.second = 0

        return gregorian.date(from: dateComponents)
    }
}
 

Вы можете вызвать расширение с помощью:

 let date = "15:26".createDateObjectWithTime()
 

введите описание изображения здесь

Ответ №2:

Просто получите текущую дату и установите час и минуту в соответствии с извлеченными значениями

 extension String {
    func convertToDate() -> Date? {
        let arr = self.split(separator: ":")
        guard
            let hour = Int(arr.first ?? ""),
            let minute = Int(arr.last ?? "")
        else { return nil }
        
        var cal = Calendar.current
        guard let timezone = TimeZone(identifier: "Asia/Jakarta") else { return nil }
        cal.timeZone = timezone
        return cal.date(bySettingHour: hour, minute: minute, second: 0, of: Date())
    }
}
 

Комментарии:

1. я получаю этот результат ashar: 2021-01-12 08:35:00 дата указана правильно, но не для времени @vadian