Lors de l'analyse d'une date à partir d'une chaîne, comment puis-je empêcher sa conversion en heure locale ?
Lorsque je convertis n'importe quel type d'horodatage en une date, que ce soit UTC ou avec un autre décalage, il le convertit en mon heure locale. Comment puis-je l'empêcher de faire ça?
À titre d'exemple, le code suivant s'imprime 2022-05-24 09:40:11 +0000
mais il doit apparaître sous la forme 2022-05-24 01:40:11 +0000
. Je ne veux pas l'heure équivalente dans mon propre fuseau horaire qu'il revient
let dateStr = "2022-05-024T01:40:11.126-08:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
let parsedDate = dateFormatter.date(from: dateStr)
print(parsedDate)
Date
est juste un conteneur pour le temps qui s'est écoulé depuis un point d'ancrage (c'est-à-dire des millisecondes depuis l'époque Unix), il ne "convertit" pas la valeur, ce qu'il fait, c'est que lorsque vous utilisez "print", il fait utilisation des plates-formes locale/timezone pour présenter une présentation "lisible par l'homme" de l'heure qu'elle représente
Par exemple...
let dateStr = "2022-05-024T01:40:11.126-08:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
let date = dateFormatter.date(from: dateStr)!
print(date)
impressions2022-05-24 09:40:11 +0000
Mais, si je change le fuseau horaire du formateur, par exemple...
let utcFormatter = DateFormatter()
utcFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
utcFormatter.timeZone = TimeZone(abbreviation: "UTC")
let utcDate = utcFormatter.date(from: dateStr)!
print(utcDate)
ça imprime toujours2022-05-24 09:40:11 +0000
D'accord, il s'imprime de toute façon en UTC, alors essayons un fuseau horaire différent :
let auFormatter = DateFormatter()
auFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
auFormatter.timeZone = TimeZone(abbreviation: "AEST")
let auDate = auFormatter.date(from: dateStr)!
print(auDate)
ça imprime toujours2022-05-24 09:40:11 +0000
Si nous lisons la documentation , il est écrit "La représentation n'est utile que pour le débogage".
Si vous voulez que la présentation soit faite différemment, utilisez un autre formateur, par exemple...
let dateStr = "2022-05-024T01:40:11.126-08:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
let date = dateFormatter.date(from: dateStr)!
print(date)
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
print(dateFormatter.string(from: date))
dateFormatter.timeZone = TimeZone(secondsFromGMT: -(8 * 60 * 60))
print(dateFormatter.string(from: date))
dateFormatter.timeZone = TimeZone(abbreviation: "AEST")
print(dateFormatter.string(from: date))
Qui imprime...
2022-05-24 09:40:11 +0000 // print(date)
2022-05-24T09:40:11.126Z // UTC
2022-05-24T01:40:11.126-08:00 // -8
2022-05-24T19:40:11.126+10:00 // AEST
(évidemment, vous pouvez également configurer le Locale
pour différentes représentations)
Ils représentent tous la même valeur de date/heure, juste à des fuseaux horaires différents
Vous pouvez également vérifier les différentes valeurs de date à l'aide de Date#timeIntervalSinceReferenceDate
ou Date#timeIntervalSince1970
, par exemple...
let dateStr = "2022-05-024T01:40:11.126-08:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
print(dateFormatter.date(from: dateStr)!.timeIntervalSince1970)
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
print(dateFormatter.date(from: dateStr)!.timeIntervalSince1970)
dateFormatter.timeZone = TimeZone(secondsFromGMT: -(8 * 60 * 60))
print(dateFormatter.date(from: dateStr)!.timeIntervalSince1970)
dateFormatter.timeZone = TimeZone(abbreviation: "AEST")
print(dateFormatter.date(from: dateStr)!.timeIntervalSince1970)
qui imprime...
1653385211.126
1653385211.126
1653385211.126
1653385211.126
Et comme l' indiquent les docs , "L'intervalle entre la valeur de la date et 00:00:00 UTC le 1er janvier 1970."
Dans ce cas, le fuseau horaire du formateur n'a pas d'effet sur l'analyse, uniquement sur la présentation ( locale
il peut résoudre les problèmes d'analyse, mais c'est un autre sujet)