Search code examples
swiftdatecalendarnsdatecomponentsdateformatter

Wrong Date is Display from DateComponets


let dateString = "2017-10-08T00:12:00.000Z"
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"


let date = formatter.date(from: dateString)!



let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date)  

print("Day - \(components.day!)")
print("Month - \(components.month!)")
print("Year - \(components.year!)")

print("Hour - \(components.hour!)")
print("Min - \(components.minute!)")
print("Second - \(components.second!)")


print("Final Date - \(components.date!)")

By running the above code i got the output

Day - 7
Month - 10
Year - 2017
Hour - 20
Min - 12
Second - 0
Final Date - 2017-10-08 00:12:00 +0000
But my Expected Date should be
Final Date - 2017-10-07 20:12:00 +0000


Solution

  • I GOT SOLUTION AS @Leo Dabus say issue with Timezone so

        let dateString = "2017-10-08T00:12:00.000Z"
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
    
    
        let date = formatter.date(from: dateString)!
    
        let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date) 
    
       //Converting part 
        let gregorian = Calendar(identifier: .gregorian)
        var dateComponents = components
       dateComponents.timeZone = TimeZone.init(identifier: "UTC") //Here is the logic
        let myDate = gregorian.date(from: dateComponents)!
        print(myDate)
    

    Now i get the converted date as output. 2017-10-07 20:12:00 +0000