2016-10-18 4 views
-4

Мне нужна разница между миллисекундами и датой на данный момент. Его нужно отформатировать как HH: mm: ss, и мой код не выходит с правильной разницей.Получите разницу между двумя датами

var differenceDate = NSDate(timeIntervalSince1970: Double(currentTimeInMiliseconds())) 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "HH:mm:ss" 
     self.callDetail.text = dateFormatter.string(from: differenceDate as Date) 

func currentTimeInMiliseconds() -> Int! { 
     let date = NSDate() 
     return Int(date.timeIntervalSince1970 * 1000) 
    } 
+0

Свидание это количество секунд под капотом. Но количество секунд (миллисекунд) - это не дата! Ваше использование DateFormatter здесь совершенно неуместно. – matt

+0

Мои бизнес-правила требуют от меня использовать миллисекунды, поэтому я должен использовать его. Двойной (currentTimeInMiliseconds фактически переходит к переменной, содержащей миллисекунды, но я изменил ее, чтобы лучше объяснить. – user1079052

+1

Это не имеет ничего общего с миллисекундами. Слушайте то, что я говорю. 'DifferenceDate' не является датой. Его нельзя отформатировать как HH: mm: ss "используя формат даты. Это не дата. Нет A. Дата – matt

ответ

1

Проблема заключается в том, что differenceDate, несмотря на название, это не свидание! Это всего лишь временной интервал - абстрактное количество секунд. Если вы хотите выразить это как часы, минуты и секунды, просто продолжайте разделение на 60 и проведите остаток. Но имейте в виду, что это не real часов, минут и секунд.

Пример:

// make two dates, get the difference 
let greg = Calendar(identifier: .gregorian) 
let dc = DateComponents(calendar: greg, 
    year: 1954, month: 8, day: 10, hour: 3, minute: 0, second: 0) 
let d1 = greg.date(from: dc)! 
let d2 = Date() 
let diff = d2.timeIntervalSince(d1) 

// calculate hours, minutes, and seconds 
var min = diff/60 
let sec = diff.truncatingRemainder(dividingBy: 60) 
let hr = min/60 
min = min.truncatingRemainder(dividingBy: 60) 

// format the output as a string 
let nf = NumberFormatter() 
nf.roundingMode = .floor 
nf.minimumIntegerDigits = 2 

let hrs = nf.string(from: hr as NSNumber) 
let mins = nf.string(from: min as NSNumber) 

nf.maximumFractionDigits = 3 
let secs = nf.string(from: sec as NSNumber) 

print(hrs! + ":" + mins! + ":" + secs!) // 545169:33:18.841 

Это дает нужный формат и ваши миллисекунды. Вы можете сделать то же самое с DateComponentsFormatter, как это предложил Роб, но вы получите точно такой же рассчитанный результат.

3

Если вы хотите увеличить время между двумя объектами даты в формате HH:mm:ss, вы обычно используете NSDateComponentsFormatter. В Swift 3:

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .positional 
formatter.allowedUnits = [.hour, .minute, .second] 
formatter.zeroFormattingBehavior = .pad 

let string = formatter.string(from: referenceDate, to: date) 

В Swift 2:

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Positional 
formatter.allowedUnits = [.Hour, .Minute, .Second] 
formatter.zeroFormattingBehavior = .Pad 

let string = formatter.stringFromDate(referenceDate, toDate: date) 
0

Я обнаружил, что самый простой способ заключается в использовании NSCalendar

let calendar: NSCalendar = NSCalendar.current as NSCalendar 
     let date1 = call!.startTime.dateFromMilliseconds() 
     let date2 = NSDate() 
     let components = calendar.components([.hour, .second, .minute], from: date1 , to: date2 as Date, options: []) 
     differenceDate = NSCalendar(identifier: NSCalendar.Identifier.gregorian)?.date(from: components) as NSDate! 
Смежные вопросы