Преобразование 12-значных тиков в дату - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь преобразовать 12 цифр c # даты и времени в формате даты.(648000000000).С помощью следующей ссылки я добавил в свой код расширение Как получить 18-значную текущую метку времени в Swift? .

extension Date {
    init(ticks: UInt64) {
        self.init(timeIntervalSince1970: Double(ticks)/10_000_000 - 62_135_596_800)
    }
}

let date = Date (ticks:648000000000)

Когда я пытаюсь увидеть дату результата, он печатает следующее;

0001-01-03 18:00:00 + 0000

Однако, когда я пытаюсь преобразовать его, формат отображения часов и минут не имеет значения, как 19: 55

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
dateFormatter.string(from: date)

Мой первый вопрос: как мне отформатировать его, чтобы получить только 18:00.Во-вторых, почему печатается 18:00, когда я печатаю только дату, а 19:55 - когда я ее форматирую?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Очевидно, что ваша временная метка представляет собой длительность как число тиков в 100 наносекунд, а не дату.Если вы разделите число на 10 ^ 7, вы получите количество секунд.Они могут быть напечатаны как длительность с DateComponentsFormatter.

Пример:

let ticks = 648000000000

let seconds = TimeInterval(ticks) / 10_000_000
let fmt = DateComponentsFormatter()
fmt.allowedUnits = [.hour, .minute]
print(fmt.string(from: seconds)!)

18: 00

Продолжительность составляет 64800 =18 * 60 * 60 секунд, то есть ровно 18 часов.

0 голосов
/ 20 декабря 2018

Только не вычитайте 62_135_596_800

extension Date {
    init(ticks: UInt64) {
        self.init(timeIntervalSince1970: Double(ticks)/10_000_000)
    }
}

1970-01-01 18:00:00 + 0000

Другая проблема: когда высоздайте date и распечатайте его, строка отформатирована в часовом поясе UTC (смещение GMT ​​+ 0).Но DateFormatter возвращает строковое представление в зависимости от его часового пояса, который по умолчанию является местным часовым поясом.

Вы можете исправить свой код, просто установив dateFormatter s timeZone в UTC

dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

18: 00

...