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.
3 Réponses :
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)
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.
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)
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
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 }
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.