2016-10-18 43 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

我的业务规则要求我使用毫秒,所以我必须使用它。 double(currentTimeInMiliseconds实际上是一个持有毫秒数的变量,但我改变了它可以更好地解释。 – user1079052

+1

这与毫秒毫无关系。听我说的是什么。'differenceDate'不是日期,它不能被格式化作为HH:mm:ss“使用日期格式化程序它不是日期不是日期日期 – matt

回答

1

问题是,differenceDate,尽管名称,不是日期!这只是一个时间间隔 - 一个抽象的秒数。如果你想用小时,分钟和秒来表达它,只需保持60除以剩余。但请记住,这些不是真实小时和分钟和秒钟。

例子:

// 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 

这给你你想要的格式和您毫秒。按照Rob的建议,您可以使用DateComponentsFormatter做同样的事情,但您会得到完全相同的计算结果。

3

如果您希望格式为HH:mm:ss的两个日期对象之间的时间量,您通常会使用NSDateComponentsFormatter。在夫特3:

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

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

在夫特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!