Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 3.0 : Convert server UTC time to local time and vice-versa

I want to convert server UTC time to local time and vice-versa. Here is my code..

var isTimeFromServer = true var time:String! var period:String! let timeString = "6:59 AM" //Current UTC time  if isTimeFromServer {      let index = timeString.index(timeString.startIndex, offsetBy: 5)     let twelve = timeString.substring(to: index)      var dateString:String!      let dateFormatter = DateFormatter()     dateFormatter.dateFormat = "H:mm"     let date12 = dateFormatter.date(from: twelve)!      dateFormatter.dateFormat = "h:mm a"     let date22 = dateFormatter.string(from: date12)      //print(date22)     dateString = date22     //print("dateString=\(dateString)")      time = dateString.components(separatedBy: " ")[0]     period = dateString.components(separatedBy: " ")[1]  } else {     time = timeString.components(separatedBy: " ")[0]     period = timeString.components(separatedBy: " ")[1] }  var hour = Int(time.components(separatedBy: ":")[0])  hour = period == "AM" ? hour : hour! + 12 let minute = Int(time.components(separatedBy: ":")[1]) let calender = NSCalendar.current var datecomponent = DateComponents() datecomponent.calendar = calender datecomponent.hour = hour datecomponent.minute = minute  if !isTimeFromServer {     // local to UTC     datecomponent.timeZone = TimeZone.current } else {     datecomponent.timeZone = TimeZone(abbreviation: "UTC") }  let date = datecomponent.date let dateFormatter = DateFormatter()  if !isTimeFromServer {     dateFormatter.dateFormat = "H:mm"     dateFormatter.timeZone = TimeZone(abbreviation: "UTC")     dateFormatter.string(from: date!) } else {     //UTC to local     dateFormatter.dateFormat = "h:mm a"     dateFormatter.timeZone = TimeZone.current     dateFormatter.string(from: date!) } 

I get the local time

o/p: "12:52 PM"

But actual local time and output time difference is 23 minutes.

like image 418
NiravS Avatar asked Mar 15 '17 07:03

NiravS


People also ask

How do you convert UTC to local time in Swift?

I want to convert server UTC time to local time and vice-versa. Here is my code.. var isTimeFromServer = true var time:String! var period:String! let timeString = "6:59 AM" //Current UTC time if isTimeFromServer { let index = timeString.

Does moment convert UTC to local?

To convert UTC time to Local you have to use moment. local() .


1 Answers

I don't know what's wrong with your code.
But looks too much unnecessary things are there like you're setting calendar, fetching some elements from string. Here is my small version of UTCToLocal and localToUTC function.
But for that you need to pass string in specific format. Cause I've forcly unwrapped date objects. But you can use some guard conditions to prevent crashing your app.

func localToUTC(dateStr: String) -> String? {     let dateFormatter = DateFormatter()     dateFormatter.dateFormat = "h:mm a"     dateFormatter.calendar = Calendar.current     dateFormatter.timeZone = TimeZone.current          if let date = dateFormatter.date(from: dateStr) {         dateFormatter.timeZone = TimeZone(abbreviation: "UTC")         dateFormatter.dateFormat = "H:mm:ss"              return dateFormatter.string(from: date)     }     return nil }  func utcToLocal(dateStr: String) -> String? {     let dateFormatter = DateFormatter()     dateFormatter.dateFormat = "H:mm:ss"     dateFormatter.timeZone = TimeZone(abbreviation: "UTC")          if let date = dateFormatter.date(from: dateStr) {         dateFormatter.timeZone = TimeZone.current         dateFormatter.dateFormat = "h:mm a"              return dateFormatter.string(from: date)     }     return nil } 

and call these function like below.

print(utcToLocal(dateStr: "13:07:00")) print(localToUTC(dateStr: "06:40 PM")) 

Hope this will help you.
Happy coding!!

like image 190
Mrugesh Tank Avatar answered Sep 21 '22 05:09

Mrugesh Tank