Как получить день на основе поля времени (секунды с полуночи 1970 года)? - PullRequest
0 голосов
/ 17 февраля 2019

Я собираю данные из API, и одно из значений, которое я получаю, относится к дню недели, данные, возвращаемые из API, выглядят так:

"time": 1550376000

Я создал эту функциючтобы получить дату:

  func getDate(value: Int) -> String {
        let date = Calendar.current.date(byAdding: .day, value: value, to: Date())
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "E"

        return dateFormatter.string(from: date!)
    }

, но нам сказали, что есть гораздо более безопасный способ получить ее, чем предполагать, что мы получаем последовательные дни, начиная с сегодняшнего дня.Кто-нибудь знает, как построить дату из поля времени (это секунды с полуночи 1970 года), а затем использовать Calendar и DateComponent, чтобы вычислить день?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Похоже, что вы получаете данные JSON, поэтому вы должны структурировать свои данные и соответствовать протоколу Decodable для преобразования ваших данных в объект, правильно структурированный.

struct Object: Decodable {
    let time: Date
}

Не забудьте установить для свойства dateDecodingStrategy декодера значение secondsSince1970

do {
    let obj = try decoder.decode(Object.self, from: Data(json.utf8))
    let date = obj.time   // "Feb 17, 2019 at 1:00 AM"
    print(date.description(with: .current))// "Sunday, February 17, 2019 at 1:00:00 AM Brasilia Standard Time\n"
} catch {
    print(error)
}

Тогда вам просто нужно получить компонент дня недели (1 ... 7 =Sun ... Sat) и получите календарь shortWeekdaySymbols (локализованный), вычтите 1 из значения компонента и используйте его в качестве индекса для получения соответствующего символа.Тот же подход, который я использовал в этом посте Как напечатать название дня недели? , чтобы получить полное название дня недели:

extension Date {
    var weekDay: Int {
        return Calendar.current.component(.weekday, from: self)
    }
    var weekdaySymbolShort: String {
        return Calendar.current.shortWeekdaySymbols[weekDay-1]
    }
}

print(date.weekdaySymbolShort)   // "Sun\n"
0 голосов
/ 17 февраля 2019

Вы можете использовать Calendar для получения компонента даты из Date:

let date = Date(timeIntervalSince1970: time)// time is your value 1550376000
let timeComponents = Calendar.current.dateComponents([.weekday, .day, .month, .year], from: date)
print("\(timeComponents.weekday) \(timeComponents.day!) \(timeComponents.month!) \(timeComponents.year!)") // print "7 16 2 2019"
print("\(\(Calendar.current.shortWeekdaySymbols[timeComponents.weekday!-1]))") // print "Sat"

Надеюсь, это поможет.

...