MST to IST wrong timezone conversion by abbreviation

67 Views Asked by At

In my code I am getting time and its format time zone like "IST", "MST" from a server and by using that I need to convert a given time to local device's time. For that I am using TimeZone(abbreviation:) method and its working fine with all formats except "MST" format. I am getting converted time one hour after.

In following code I am getting output as 04:30PM and 04:29PM which is one hour after the actual time. (here given time's format is "MST")

let startDateString = "04:00:00" // expected 3:30pm after convertine to IST
let endDateString = "03:59:59"
let timeZoneString = "MST"

func getTime() {
    if let scheduleTimeZone = TimeZone(abbreviation: timeZoneString)  {
        let startScheduledTime = toScheduledTime(startDateString, using: scheduleTimeZone)
        let endScheduledTime = toScheduledTime(endDateString, using: scheduleTimeZone)
        
        print(startScheduledTime)
        print(endScheduledTime)
    }

}


/// Method to get local time for scheduled time
func toScheduledTime(_ time: String, using timeZone: TimeZone) -> String {
    let today = "2022-05-09"
    guard  let dateTimeScheduleTZ = (today + " " + time).dateTime(createWithTZ: timeZone,
                                                                       format: "yyyy-MM-dd HH:mm:ss") else {
        return ""
    }
    return dateTimeScheduleTZ.dateTime(createLocal: "hh:mma")
}



extension String {
    
    func dateTime(createWithTZ timeZone: TimeZone,
                  format: String) -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.timeZone = timeZone
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        guard let date = dateFormatter.date(from: self) else {
            return nil
        }
        return date
    }
}

extension Date {
    func dateTime(createLocal format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.string(from: self)
    }
}

getTime()
0

There are 0 best solutions below