Pour formater un instant de publication dans un autre fuseau horaire, conservez l'instant original et donnez la zone de destination au formateur. Ce guide Terminal Mac produit une étiquette de publication lisible sans analyser le texte affiché ni ajouter manuellement des heures.
De quelles informations avez-vous besoin avant de convertir ?
Supposons que vous prépariez un document sur votre Mac et receviez l'horodatage de publication synthétique 2025-07-15T00:30:00Z. Vous avez besoin de la date et de l'heure de publication telles qu'affichées dans America/Los_Angeles. La tâche consiste à décrire ce même moment en utilisant la date du calendrier et l'heure de l'horloge de la destination.
Quatre termes déterminent si vous disposez de suffisamment d'informations :
| Terme | Exemple synthétique | Signification pour cette tâche |
|---|---|---|
| Date civile | 2025-07-15 |
Un jour de calendrier, sans heure ni zone |
| Instant | Le moment représenté par 2025-07-15T00:30:00Z |
Le point dans le temps que vous conservez |
| Décalage UTC | -07:00 |
La différence entre l'heure locale et UTC à un instant particulier |
| Fuseau horaire nommé | America/Los_Angeles |
Règles utilisées pour déterminer le décalage applicable |
RFC 3339 définit les horodatages contenant une date complète, une heure et un décalage UTC. RFC 9557 explique la distinction supplémentaire : un fuseau nommé fournit des règles qui associent un instant à un décalage, tandis que le décalage numérique seul d'un horodatage ne décrit pas comment le décalage d'un lieu se comporte à d'autres moments. RFC 3339, Section 5.6, RFC 9557, Section 1.2.
Utilisez cette décision d'entrée avant d'effectuer toute conversion :
- Vous avez déjà un
DateFoundation : transmettez-le directement à un formateur configuré pour la zone de destination. - Vous avez un horodatage avec
Zou un décalage numérique explicite : analysez cet horodatage original une fois, puis formatez l'instant résultant. - Vous n'avez qu'une date civile : conservez-la en tant que date, sauf si la tâche fournit explicitement une heure et une zone.
- Vous avez une date et une heure locales sans décalage : obtenez la zone source et résolvez toute ambiguïté avant de la traiter comme un instant.
Par exemple, 2025-07-15 ne peut pas vous dire si la publication a eu lieu avant ou après minuit dans une autre zone. Attribuer minuit introduirait une hypothèse. De même, une lecture d'horloge locale peut correspondre à zéro ou plusieurs instants autour d'une transition de décalage ; RFC 9557 documente cette limite. La conversion d'un instant déjà établi évite ce problème de mappage inverse. RFC 9557, Section 1.2.
Pourquoi faut-il éviter de réanalyser le texte d'affichage ?
Apple définit Date de Foundation comme un point précis dans le temps, indépendant de tout calendrier ou fuseau horaire. Sa valeur n'a pas besoin de devenir un autre Date pour apparaître dans une autre zone. Le formatage fournit le calendrier et la zone nécessaires pour produire du texte. Date.
Une étiquette d'affichage peut omettre des informations. Si vous formatez un instant en tant que date sans son heure, puis analysez cette étiquette, l'heure manquante ne peut pas être récupérée à partir de l'étiquette. La documentation de formatage d'Apple montre un aller-retour date seule qui reconstruit minuit. C'est utile lorsque minuit est intentionnel, mais cela ne conserve pas un instant de publication arbitraire. Date.FormatStyle.
Gardez l'opération dans cet ordre :
- Lisez l'horodatage original ou obtenez le
Dateexistant. - Conservez cet instant comme valeur de travail.
- Choisissez la zone de destination, le calendrier et la locale d'affichage.
- Formatez l'instant conservé dans l'étiquette finale.
Ajouter manuellement un décalage change également la tâche. Apple documente addingTimeInterval(_:) comme créant une nouvelle date en ajoutant du temps écoulé. Ajouter sept heures produit donc un autre instant ; choisir la zone du formateur change la façon dont l'instant original est représenté. Date.
Exécutez un exemple complet d'heure de publication sur votre Mac
L'exemple nécessite macOS 12 ou version ultérieure, où l'API Date.FormatStyle d'Apple est disponible, et une chaîne d'outils Swift fonctionnelle. Il utilise Foundation, sans paquets supplémentaires. Date.FormatStyle.
Ouvrez Terminal et vérifiez la chaîne d'outils :
swift --version
Si vous avez besoin des outils de ligne de commande d'Apple, exécutez la commande suivante et terminez la boîte de dialogue d'installation. Apple documente cette voie d'installation et note qu'une installation complète de Xcode inclut déjà les outils de ligne de commande. Répétez ensuite la vérification de version. Installation des outils de ligne de commande.
xcode-select --install
Dans TextEdit, créez un nouveau document et choisissez Format > Convertir en texte brut. Collez le programme Swift complet ci-dessous et enregistrez-le sur votre Bureau sous le nom publication-time.swift. Assurez-vous que le nom de fichier résultant se termine par .swift, sans extension .txt ajoutée. Le guide TextEdit d'Apple documente la création, la conversion et l'enregistrement de documents en texte brut. Créer, ouvrir et convertir des documents dans TextEdit sur Mac.
Ce programme accepte l'horodatage entier en secondes fourni, l'analyse une fois et crée trois représentations à partir du même instant. Apple documente ISO8601DateFormatter pour l'analyse et la génération de représentations ISO 8601, et son option withInternetDateTime pour le format RFC 3339. ISO8601DateFormatter, withInternetDateTime.
import Foundation
// Synthetic publication data. Change these two values as needed.
let sourceTimestamp = "2025-07-15T00:30:00Z"
let destinationIdentifier = "America/Los_Angeles"
enum ConversionError: Error {
case invalidTimestamp(String)
case unknownTimeZone(String)
}
let inputFormatter = ISO8601DateFormatter()
inputFormatter.formatOptions = [.withInternetDateTime]
inputFormatter.timeZone = TimeZone(secondsFromGMT: 0)
guard let instant = inputFormatter.date(from: sourceTimestamp) else {
throw ConversionError.invalidTimestamp(sourceTimestamp)
}
guard let destination = TimeZone(identifier: destinationIdentifier) else {
throw ConversionError.unknownTimeZone(destinationIdentifier)
}
let destinationFormatter = ISO8601DateFormatter()
destinationFormatter.formatOptions = [.withInternetDateTime]
destinationFormatter.timeZone = destination
let publicationLabelStyle = Date.FormatStyle(
date: .long,
time: .complete,
locale: Locale(identifier: "en_GB"),
calendar: Calendar(identifier: .gregorian),
timeZone: destination
)
let publicationDateStyle = Date.FormatStyle(
date: .long,
time: .omitted,
locale: Locale(identifier: "en_GB"),
calendar: Calendar(identifier: .gregorian),
timeZone: destination
)
print("Source instant: \(inputFormatter.string(from: instant))")
print("Destination zone: \(destination.identifier)")
print("Destination timestamp: \(destinationFormatter.string(from: instant))")
print("Publication label: \(instant.formatted(publicationLabelStyle))")
print("Publication date: \(instant.formatted(publicationDateStyle))")
Exécutez le programme enregistré :
swift "$HOME/Desktop/publication-time.swift"
Pour les valeurs fournies, l'horodatage de destination devrait être 2025-07-14T17:30:00-07:00, et la date de publication devrait représenter le 14 juillet 2025. L'étiquette lisible inclut également les informations d'heure et de zone ; sa formulation précise et sa ponctuation proviennent du système de formatage.
Le programme Swift a été inspecté par rapport à la documentation API récupérée, mais n'a pas été exécuté dans l'environnement de recherche car Swift n'était pas disponible. Les conversions d'exemple numériques ont été vérifiées séparément avec les API de date/heure et de fuseau horaire de Python.
Quels paramètres contrôlent le résultat ?
L'initialiseur du formateur accepte des paramètres distincts pour la locale, le calendrier et le fuseau horaire. Ici, en_GB demande les conventions de formatage anglaises britanniques, le calendrier grégorien fournit le système de date, et destination détermine la date locale et l'heure d'horloge. Changez l'identifiant de zone lorsque vous avez besoin d'une autre destination ; changez la locale lorsque vous avez besoin d'une autre convention de présentation. init(date:time:locale:calendar:timeZone:capitalizationContext:).
Le résultat date seule provient toujours directement de instant. Définir time: .omitted supprime l'heure de l'étiquette de sortie. Cela ne nécessite pas la construction d'un nouvel instant à minuit.
Vérifiez les passages à minuit et les décalages saisonniers
Utilisez les exemples synthétiques suivants pour vérifier si votre résultat préserve l'opération prévue. Ce sont des horodatages de publication illustratifs, avec des représentations de destination calculées.
| Instant original | Zone de destination | Représentation de destination |
|---|---|---|
2025-01-15T00:30:00Z |
America/Los_Angeles |
2025-01-14T16:30:00-08:00 |
2025-07-15T00:30:00Z |
America/Los_Angeles |
2025-07-14T17:30:00-07:00 |
2025-07-15T00:30:00Z |
Asia/Tokyo |
2025-07-15T09:30:00+09:00 |
2025-07-15T23:30:00Z |
Asia/Tokyo |
2025-07-16T08:30:00+09:00 |
Les deux premières lignes montrent pourquoi un ajustement fixe est insuffisant pour une destination nommée : son décalage applicable peut dépendre de l'instant. Les deux dernières lignes montrent pourquoi vous devez dériver la date de calendrier complète de la destination avec son heure. Une publication peut apparaître la veille, le même jour ou le lendemain.
Les zones nommées utilisent les règles d'une base de données de fuseaux horaires. IANA documente que macOS utilise sa base de données et que les mises à jour parviennent généralement aux clients via les mises à jour du système d'exploitation. Si les résultats diffèrent entre les machines, vérifiez leurs identifiants de zone et les mises à jour disponibles avant de modifier l'horodatage source. Données sur les fuseaux horaires et l'heure d'été.
Que faire lorsque l'entrée ou la sortie est inattendue ?
Effectuez ces vérifications dans l'ordre :
- Confirmez que la source identifie un instant. Conservez son
Zou son décalage numérique. Une valeur date seule ou une lecture d'horloge locale nécessite des informations supplémentaires. - Confirmez l'identifiant de destination. Utilisez un identifiant tel que
America/Los_Angeles. L'initialiseur d'Apple renvoienilpour un identifiant inconnu ; ce programme s'arrête avec une erreur au lieu de substituer une autre zone. - Vérifiez la forme prise en charge de l'horodatage. L'exemple est configuré pour les horodatages internet à secondes entières. Les secondes fractionnaires ou une autre représentation d'entrée nécessitent une configuration d'analyseur appropriée. Conservez l'entrée originale lors de ce changement.
- Comparez l'horodatage de destination numérique. Utilisez sa date, son heure et son décalage pour évaluer la conversion avant d'examiner la ponctuation d'affichage.
- Vérifiez que chaque sortie utilise l'
instantoriginal. Supprimez toute étape intermédiaire qui formate une étiquette, puis analyse cette étiquette pour la conversion suivante. init(identifier:), ISO8601DateFormatter.
Une zone nommée et un décalage peuvent également être transportés ensemble dans un horodatage étendu sous RFC 9557. L'existence de cette norme n'établit pas la prise en charge de ses annotations de zone entre crochets dans l'analyseur de cet exemple. Conservez l'identifiant de destination dans la valeur destinationIdentifier séparée utilisée ci-dessus, sauf si vous implémentez et vérifiez délibérément un chemin d'entrée au format étendu. RFC 9557.
Pour une étiquette de publication, conservez l'instant original comme valeur réutilisable et générez le texte de chaque destination à partir de celui-ci. Cela vous permet de changer la zone de destination, la langue d'affichage ou le détail visible tout en gardant chaque étiquette liée au même moment de publication.
Sources
- Date — Apple
- Date.FormatStyle — Apple
- init(date:time:locale:calendar:timeZone:capitalizationContext:) — Apple
- ISO8601DateFormatter — Apple
- withInternetDateTime — Apple
- init(identifier:) — Apple
- Installation des outils de ligne de commande — Apple
- Créer, ouvrir et convertir des documents dans TextEdit sur Mac — Apple
- RFC 3339 : Date et heure sur Internet : Horodatages — Éditeur RFC
- RFC 9557 : Date et heure sur Internet : Horodatages avec informations supplémentaires — Éditeur RFC
- Données sur les fuseaux horaires et l'heure d'été — IANA