#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