I’m using this code to convert HH:mm string to gmt time string HH:mm:
func convertToGMT(timeString: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
// Assuming the input time is in the user's local time zone
dateFormatter.timeZone = TimeZone.current
// Parse the input time string into a Date object
guard let date = dateFormatter.date(from: timeString) else {
return "" // Return nil if the input format is invalid
}
// Convert the date to GMT (UTC) time zone
dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
let gmtTimeString = dateFormatter.string(from: date)
return gmtTimeString
}
The problem is that is Jerusalem gmt -3 i get for 12:00 -> 10:00 instead of 09:00.
What is the problem?
3
Answers
The problem is how your converting the date, when you’re doing the conversion to date using the date formatter
It is producing the following date
2000-01-01 10:00:00 +0000
.Upon looking on a time zone converter website the result produced below shows that the conversion being done on your current code is correct.
The conversion shown below using current date indicates a difference of 3 hours, which is also the difference you expected your code to produce. This difference is explained by JeremyP in the comments:
A possible solution is to create the date using DateComponents:
As mentioned in Claudio’s answer the actual time difference depends on the date portion, and the confusion occurs because
DateFormatter
sets the date to Jan 1, 2000 for a pure time string.You have to calculate the time difference from the time in today to consider daylight saving time.
This is an approach which extracts hour and minute with Regular Expression and sets the hour and minute of the current date with
date(bySettingHour:minute:second:of:
ofCalendar
.The code works in any locale and throws errors for a format mismatch and if the digits are not in 0..<24 (hour) and 0..<60 (minute).
The problem is that you need to set the
dateFormater
’s defaultDate to startOfDay for.now
. Make sure to set thedateFormatter
calendar property as well.