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()