2017-03-15 2 views
6

Je souhaite convertir l'heure UTC du serveur en heure locale et vice-versa. Voici mon code ..Swift 3.0: Convertir l'heure UTC du serveur en heure locale et vice-versa

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!) 
} 

Je reçois l'heure locale

o/p: "24:52"

Mais réelle heure locale et l'heure de sortie est la différence 23 minutes. Alors s'il vous plaît aidez à résoudre ceci. Merci d'avance.

Répondre

19

Je ne sais pas quel est le problème avec votre code.
Mais regarde trop de choses inutiles sont là, comme vous définissez le calendrier, aller chercher des éléments de la chaîne. Voici ma petite version de la fonction UTCToLocal et localToUTC.
Mais pour cela, vous devez passer une chaîne dans un format spécifique. Parce que j'ai forcement déballé des objets de date. Mais vous pouvez utiliser certaines conditions de protection pour éviter de bloquer votre application.

func localToUTC(date:String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mm a" 
    dateFormatter.calendar = NSCalendar.current 
    dateFormatter.timeZone = TimeZone.current 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
    dateFormatter.dateFormat = "H:mm:ss" 

    return dateFormatter.string(from: dt!) 
} 

func UTCToLocal(date:String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "H:mm:ss" 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.dateFormat = "h:mm a" 

    return dateFormatter.string(from: dt!) 
} 

et d'appeler ces fonctions comme ci-dessous.

print(UTCToLocal(date: "13:07:00")) 
print(localToUTC(date: "06:40 PM")) 

Espérons que cela vous aidera.
Codage heureux !!

+1

C'est exactement ce que je veux .. Merci @Mrugesh. – NiravS

+0

Super !!! Merci! – iDev750

+1

la seule chute est inefficace. chaque itération de cette fonction prend environ 0,23 milliseconde. pour comparer des milliers de dates, cela sera inefficace – quemeful

1

S'il vous plaît essayer:

func convertUTCToLocal(timeString: String) -> String? { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mm a" 

    dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") 
    let timeUTC = dateFormatter.date(from: timeString) 

    if timeUTC != nil { 
     dateFormatter.timeZone = NSTimeZone.local 

     let localTime = dateFormatter.string(from: timeUTC!) 
     return localTime 
    } 

    return nil 
} 



func convertLocalToUTC(localTime: String) -> String? { 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mm a" 
    dateFormatter.timeZone = NSTimeZone.local 
    let timeLocal = dateFormatter.date(from: localTime) 

    if timeLocal != nil { 
     dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") 

     let timeUTC = dateFormatter.string(from: timeLocal!) 
     return timeUTC 
    } 
    return nil 
} 


    var isTimeFromServer = true 
    var time:String! 
    var period:String! 
    let timeString = "6:59 AM" //Current UTC time 


    if isTimeFromServer { 
     print(convertUTCToLocal(timeString: timeString)) 
    } else { 
     print(convertLocalToUTC(localTime: timeString)) 
    } 
+3

Quelques * explications * seraient utiles pour les futurs lecteurs: Quel est le problème avec le code dans la question? Qu'avez-vous changé et pourquoi? –

5

La réponse de Mrugesh est parfaite, mais si quelqu'un a besoin d'utiliser ses propres formats, ou dans un format différent, je l'ai généralisé afin que vous puissiez donner un format différent ou identique dans les deux paramètres.

func localToUTC(date:String, fromFormat: String, toFormat: String) -> String { 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = fromFormat 
    dateFormatter.calendar = NSCalendar.current 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.date 
    let dt = (from: date) 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
    dateFormatter.dateFormat = toFormat 

    return dateFormatter.string(from: dt!) 
} 

func UTCToLocal(date:String, fromFormat: String, toFormat: String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = fromFormat 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.dateFormat = toFormat 

return dateFormatter.string(from: dt!) 
} 

let localDateAsString = UTCToLocal(date: dateAsString!, fromFormat: "hh:mm a, dd MMM yyyy", toFormat: "hh:mm a, dd MMM yyyy") 

Vous pouvez l'utiliser comme ci-dessus. J'espère que cela aide.

+1

J'ai trouvé cela plus utile ... –

+0

Solution parfaite !!!! – iDev750

+0

let dt = dateFormatter.date (à partir de: date) ,,, lol: D – IsPha