Lors de l'analyse d'une date à partir d'une chaîne, comment puis-je empêcher sa conversion en heure locale ?


Mat

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 +0000mais 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)
Programmes alimentaires

Dateest 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 Localepour 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#timeIntervalSinceReferenceDateou 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 ( localeil peut résoudre les problèmes d'analyse, mais c'est un autre sujet)

Articles connexes