0
votes

Comment obtenir la date actuelle du fuseau horaire actuel à partir d'un serveur de temps dans Swift?

Je travaille sur une application où je veux obtenir la date actuelle selon le fuseau horaire actuel des utilisateurs. même après que l'utilisateur change la date à partir du menu de configuration de son appareil.

Pour obtenir le fuseau horaire actuel que j'ai utilisé

let timeZone = TimeZone.current
print(timeZone)

par exemple ici, j'ai 'Asia / Kolkata' et la date actuelle est le 28 juillet, maintenant si l'utilisateur change la date (réglage-> date et heure-> décalé automatiquement) au 29 juillet à ce moment-là, j'ai obtenu une sortie comme 'Asia / Kolkata' date du 29 juillet, mais la date réelle est le 28 juillet. alors comment puis-je obtenir la date actuelle de ce fuseau horaire (Asie / Kolkata).

Remarque: je souhaite l'utiliser car j'ai besoin de la date actuelle d'un fuseau horaire particulier si l'utilisateur essaie de modifier la date du paramètre, puis après avoir besoin d'obtenir la date exacte à partir de ce fuseau horaire.


2 commentaires

Vous avez maintenant reçu des réponses qui ne fonctionnent pas pour vous, cela indique clairement que vous devez vous améliorer et clarifier votre question


@JoakimDanielson ok merci beaucoup, je change ma question avec plus de détails.


3 Réponses :


0
votes

Voici une solution simple:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let formattedDate = dateFormatter.string(from: Date())
print(formattedDate)

Vous pouvez simplement utiliser Date() aussi, mais tout en l'utilisant pour l'afficher, utilisez DateFormatter . Voici un exemple:

let timezone = TimeZone.current
let seconds = TimeInterval(timezone.secondsFromGMT(for: Date()))
let date = Date(timeInterval: seconds, since: Date())
print(date)


13 commentaires

si l'utilisateur change la date du réglage, puis après ce code donne un résultat correct selon le fuseau horaire?


Oui, la modification du fuseau horaire de l'appareil sera gérée.


super. laisse moi essayer ça


non cela ne fonctionne pas. comme je fais le changement du 28 (date d'aujourd'hui au 29). il est mis à jour


Comment mettez-vous à jour exactement le fuseau horaire?


je ne mets pas à jour le fuseau horaire. je mets juste à jour la date.


supposons que dans le fuseau horaire Asie / Kolkata aujourd'hui, la date soit 28 bonne, alors l'utilisateur essaie de changer la date de 28 à 29 à partir du paramètre afin que la nouvelle valeur affichée soit Asie / Kolkata et la date est 29, mais la date réelle est 28. obtenez-vous mon point ?


Ok, donc vous essayez de voir si l'utilisateur a mis à jour la date / heure, non? Je pense que vous avez manqué ce point dans votre message.


ok excuses pour cela, mais ma question principale est que je veux la date actuelle selon le fuseau horaire actuel même après que l'utilisateur ait défini une mauvaise date ou changé la date du réglage, il devrait renvoyer la date actuelle selon le fuseau horaire actuel


@TejasPatel vous devez utiliser un serveur de temps


@LeoDabus comment ça marche exactement? je n'en ai jamais entendu parler


il renverra une heure basée sur votre IP "http://worldtimeapi.org/api/ip"


@LeoDabus ok laissez-moi essayer ça aussi.



0
votes

Si vous voulez la date actuelle de l'utilisateur, vous pouvez simplement implémenter let date = Date() . Il renverra la date utilisée sur l'appareil de l'utilisateur.

Ceci par exemple sera affiché pour moi

let date = Date() // Jul 28, 2020 at 8:22 AM
var timezone = TimeZone.current // Europe/Berlin (current)


1 commentaires

vous n'avez pas lu correctement ma question. dans ce cas, si l'utilisateur modifie le paramètre du formulaire de date, nous obtenons une mauvaise sortie



1
votes

Si vous devez vous assurer que la date est une date valide, vous pouvez utiliser un serveur de temps pour renvoyer la date en fonction de l'adresse IP de l'appareil, bien sûr, cela nécessitera une connexion Internet.

Vous pouvez créer une méthode asynchrone pour renvoyer la date actuelle quel que soit le fuseau horaire de l'utilisateur et son fuseau horaire:


URL.asyncTime { date, timezone, error in
    guard let date = date, let timezone = timezone else {
        print("Error:", error ?? "")
        return
    }
    print("Date:", date.description(with: .current))  // "Date: Tuesday, July 28, 2020 at 4:27:36 AM Brasilia Standard Time\n"
    print("Timezone:", timezone)   // "Timezone: America/Sao_Paulo (current)\n"
}

extension URL {
    static let timeIP = URL(string: "http://worldtimeapi.org/api/ip")!
    static func asyncTime(completion: @escaping ((Date?, TimeZone?, Error?)-> Void)) {
        URLSession.shared.dataTask(with: .timeIP) { data, response, error in
            guard let data = data else {
                completion(nil, nil, error)
                return
            }
            do {
                let decoder = JSONDecoder()
                decoder.dateDecodingStrategy = .secondsSince1970
                let root = try decoder.decode(Root.self, from: data)
                completion(root.unixtime, TimeZone(identifier: root.timezone), nil)
            } catch {
                completion(nil, nil, error)
            }
        }.resume()
    }
}

Usage:

struct Root: Codable {
    let unixtime: Date
    let timezone: String
}


0 commentaires