Search code examples
iosswiftdatensdatensdateformatter

Convert date string swift


I have a date string in this format:

2016-06-20T13:01:46.457+02:00

and I need to change it to something like this:

20/06/2016

Previously I have always used this library -> SwiftDate to manipulate the dates, but it doesn't work now.

I tried also something like:

let myDate = self.dateNoteDict[indexPath.row]!
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss.SSSSxxx"
    let date = dateFormatter.dateFromString(myDate)
    print("date -> \(date)")

but it doesn't work. How can I do?

Thanks in advance.


Solution

  • The standard ISO8601 date format with fractional seconds and time zone is

    yyyy-MM-dd'T'HH:mm:ss.SSSZ

    let myDate = "2016-06-20T13:01:46.457+02:00"
    let dateFormatter = NSDateFormatter()
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") // edited
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let date = dateFormatter.dateFromString(myDate)!
    dateFormatter.dateFormat = "dd/MM/yyyy"
    let dateString = dateFormatter.stringFromDate(date)
    

    Swift 3:

    let myDate = "2016-06-20T13:01:46.457+02:00"
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // edited
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let date = dateFormatter.date(from:myDate)!
    dateFormatter.dateFormat = "dd/MM/yyyy"
    let dateString = dateFormatter.string(from:date)
    

    In macOS 10.13+, iOS 11+ ISO8601DateFormatter is an alternative as input formatter

    let myDate = "2016-06-20T13:01:46.457+02:00"
    let inputFormatter = ISO8601DateFormatter()
    inputFormatter.formatOptions = [.withFullDate, .withFullTime, .withFractionalSeconds]
    let date = dateFormatter.date(from:myDate)!
    let outputFormatter = DateFormatter()
    outputFormatter.locale = Locale(identifier: "en_US_POSIX")
    outputFormatter.dateFormat = "dd/MM/yyyy"
    let dateString = dateFormatter.string(from:date)