[SWIFT] Timestamp --> Date lisible

Bonjour tout le monde,

Je bloque sur un truc tout simple et pourtant je ne m'en sors pas..

Je récupère un timestamp que je souhaiterai convertir en date lisible, il y a plein d'exemple sur SO et d'habitude ça se passe bien mais là..

L'heure de mon serveur est en GMT.

Je créer une ligne dans ma bdd à 9h34 (heure locale), je me retrouve avec un timestamp de 1574670867 (8h34)

Je renvoi donc mon timestamp et j'essaie de retrouver 9h34 pour l'afficher..
Voici comment je m'y prends :

let timestamp = TimeInterval("1574670867")

let timezoneOffset = TimeZone.current.secondsFromGMT()
let timezoneEpochOffset = (timestamp + Double(timezoneOffset))
let timeZoneOffsetDate = Date(timeIntervalSince1970: timezoneEpochOffset)

// ici j'ai bien : 2019-11-25 09:34:27 +0000
// j'ai donc bien mon 9h34
// J'essaie maintenant de le convertir en date lisible

let dateFormatter = DateFormatter()
dateFormatter.timeZone = .current
dateFormatter.locale = .current
dateFormatter.dateFormat = "EEEE dd MMM YY"

label.text = dateFormatter.string(from: timeZoneOffsetDate as Date)

Et je me retrouve avec 10h11 ??
Je ne comprend pas comment je passe de 9h34 à 10h11 alors qu'avant le dateFormatter, j'ai bien la bonne heure.

Quelqu'un voit où j'oublie un truc ? :/

Merci de votre aide :)

Réponses

  • CéroceCéroce Membre, Modérateur
    import Foundation
    
    let serverDate = Date(timeIntervalSince1970: 1574670867)
    print(serverDate)
    

    Habituellement, un timestamp est absolu, il n'y a pas de notion de fuseau horaire.
    (GMT et UTC, c'est la même chose).

    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .full
    dateFormatter.timeStyle = .long
    let dateString = dateFormatter.string(from: serverDate)
    print(dateString)
    

    Dans ton exemple, tu ne fournis pas le format pour l'heure, donc je ne vois pas trop comment tu peux avoir 10h11. Peut-être as-tu laissé une valeur par défaut par erreur ?

  • Dans ton exemple, tu ne fournis pas le format pour l'heure, donc je ne vois pas trop comment tu peux avoir 10h11. Peut-être as-tu laissé une valeur par défaut par erreur ?

    J'me suis trompé dans l'exemple que j'ai posté, le format est : "EEEE dd MMM YY à HH:MM"

    J'ai copier/coller ton exemple pour le test, je me retrouve avec 9h11 au lieu de 9h34

    Habituellement, un timestamp est absolu, il n'y a pas de notion de fuseau horaire.

    Oui mais du coup je souhaite retrouver l'heure avec le fuseau horaire du tel..
    Théoriquement, c'est faisable nan ?
    Ou c'est moi qui me mélange les pinceaux dans mon raisonnement ?

    Mon cas concret :
    Je déclare un incident, je récupère le timestamp du serveur que je stock dans ma bdd pour cet incident.
    Lors de la récupération de l'incident, je reprend le timestamp et le renvoi au téléphone.
    Le téléphone retrouve la bonne heure en partant du timestamp et en appliquant le fuseau horaire du tel.

    Ma démarque est logique ou j'suis à côté de la plaque ?

  • PyrohPyroh Membre
    novembre 2019 modifié #4
    Non ta démarche est la bonne. Il faut toujours stocker les dates en UTC sur les backends. Réfère toi à l’ISO 8601 pour les stratégies de stockage et les best practices de conversions.

    Repose toi sur ton serveur pour l’enregistrement des timestamps ne fait aucune confiance aux clients en la matière. Sauf si tu n’as pas le choix.

    Je pense honnêtement que gérer les heures et les dates soit la pire chose qui soit en informatique. Courage
  • C’est case sensitive le format: mm != MM
  • @Pyroh ouf, je partais pas n'importe comment ^^

    @Larme rhalalala c'était ça le soucis !!

    Maintenant je m'y retrouve, j'arrive bien sur mon 9h34 donc impeccable ^^

    Merci à vous 3 :)

  • LarmeLarme Membre
    novembre 2019 modifié #7

    Note que "YY" risque potentiellement de te poser soucis également...
    Je me réfère à ceci quand je joue avec les (NS)DateFormatter

Connectez-vous ou Inscrivez-vous pour répondre.