Search code examples
iosswiftdatetimetimestampdateformatter

Swift3 - Calculate time difference between now and date from Database


I want to calculate time difference between now and date from Database.

What is the correct dateFormatter.dateFormat for "Fri Oct 13 2017 15:14:27 GMT+0200 (CEST)"?

Here is my code trial..

http://userguide.icu-project.org/formatparse/datetime

    let input = "Fri Oct 13 2017 15:14:27 GMT+0200 (CEST)"

    let dateFormatter = DateFormatter()
    var userCalendar = Calendar.current
    userCalendar.timeZone = TimeZone.current
    let requestedComponent: Set<Calendar.Component> = [.hour,.minute,.second]
    dateFormatter.dateFormat = "EEE MMM dd yyyy kk:mm:ss"
    let startTime = Date()
    let endTime = dateFormatter.date(from: input)
    let timeDifference = userCalendar.dateComponents(requestedComponent, from: endTime!, to: startTime)

    print(timeDifference)

    let date = Calendar(identifier: .gregorian).date(from: timeDifference)
    dateFormatter.dateFormat = "HH:mm:ss"
    let dateString =  dateFormatter.string(from: date!)

    print(dateString)

Thats work with:

dateFormatter.dateFormat = "dd/MM/yy hh:mm:ss"
let endTime = dateFormatter.date(from: "14/10/17 11:00:00")

Solution

  • There is two timezones in your string so you will need to remove the last one and escape the 'GMT' before parsing it. Also kk it is used for hours from 01 to 24 what you want it is 00-23 in this case you need to use HH:

    let input = "Fri Oct 13 2017 15:14:27 GMT+0200 (CEST)"
    let dateString = input.components(separatedBy: " ").dropLast().joined(separator: " ")
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z"
    let date = dateFormatter.date(from: dateString)
    

    To display the elapsed time you can use DateComponentsFormatter and use unitsStyle .positional:

    let elapsedTime = Date().timeIntervalSince(date)
    let dateComponentsFormatter = DateComponentsFormatter()
    dateComponentsFormatter.unitsStyle = .positional
    dateComponentsFormatter.string(from: elapsedTime)   // "23:32:34"