не получаю разницы в миллисекундах между двумя датами - PullRequest
0 голосов
/ 05 мая 2018

В моем приложении мне нужен какой-то таймер, например, обратный отсчет. Как и в следующем матче, осталось 1 год 2 месяца 6 дней 23 минуты 24 секунды и 5 миллисекунд.

Для этого я использую этот код:

extension DateComponentsFormatter {
    func difference(from fromDate: Date, to toDate: Date) -> String? {
        self.allowedUnits = [.year,.month,.day,.hour, .minute, .second ,.nanosecond]
        self.maximumUnitCount = 8
        self.unitsStyle = .full
        return self.string(from: fromDate, to: toDate)
    }
}

Но я не получаю миллисекунды.

Вот что я получаю:

["24 years", " 8 months", " 20 days", " 12 hours", " 2 minutes", " 48 seconds"]

Мне нужны миллисекунды.

1 Ответ

0 голосов
/ 05 мая 2018

Вы не можете использовать DateComponentsFormatter для форматирования миллисекунд. Согласно документации разрешены только следующие календарные единицы:

  • year
  • month
  • weekOfMonth
  • day
  • hour
  • minute
  • second

Вам нужно будет отформатировать это самостоятельно, набрав TimeInterval между датами, получить дробную часть временного интервала и отформатировать его.

Вот идея того, как это будет выглядеть.

extension DateComponentsFormatter {
    func difference(from fromDate: Date, to toDate: Date) -> String? {
        self.allowedUnits = [NSCalendar.Unit.second]
        allowsFractionalUnits = true
        self.maximumUnitCount = 8
        self.unitsStyle = .full
        guard let firstPart = self.string(from: fromDate, to: toDate) else { return nil }
        let milliseconds = abs(toDate.timeIntervalSince(fromDate)).remainder(dividingBy: 1) * 1000
        let numberFormatter = NumberFormatter()
        numberFormatter.maximumFractionDigits = 0
        guard let secondPart = numberFormatter.string(from: milliseconds as NSNumber) else { return nil }
        return "\(firstPart) \(secondPart) milliseconds"
    }
}

let formatter = DateComponentsFormatter()
formatter.difference(from: Date(), to: Date().addingTimeInterval(0.5))
...