Per formattare un istante di pubblicazione in un altro fuso orario, conserva l’istante originale e indica al formattatore il fuso di destinazione. Questa guida per il Terminale del Mac genera un’etichetta di pubblicazione leggibile senza analizzare il testo visualizzato né aggiungere ore manualmente.
Quali informazioni servono prima della conversione?
Supponiamo che tu stia preparando un documento sul Mac e riceva il timestamp di pubblicazione sintetico 2025-07-15T00:30:00Z. Ti servono la data e l’ora di pubblicazione così come vengono visualizzate in America/Los_Angeles. L’obiettivo è descrivere lo stesso momento usando la data di calendario e l’ora locale della destinazione.
Quattro termini determinano se hai tutte le informazioni necessarie:
| Termine | Esempio sintetico | Significato per questa operazione |
|---|---|---|
| Data civile | 2025-07-15 |
Un giorno di calendario, senza ora né fuso |
| Istante | Il momento rappresentato da 2025-07-15T00:30:00Z |
Il punto nel tempo da conservare |
| Scarto UTC | -07:00 |
La differenza tra l’ora locale e UTC in un determinato istante |
| Fuso orario con nome | America/Los_Angeles |
Le regole usate per determinare lo scarto applicabile |
RFC 3339 definisce timestamp contenenti data completa, ora e scarto UTC. RFC 9557 chiarisce un’ulteriore distinzione: un fuso con nome fornisce regole che associano uno scarto a un istante, mentre il solo scarto numerico di un timestamp non descrive come varia lo scarto di una località in altri momenti. RFC 3339, sezione 5.6, RFC 9557, sezione 1.2.
Prima di qualsiasi conversione, decidi quale caso si applica al tuo input:
- Hai già un
Datedi Foundation: passalo direttamente a un formattatore configurato per il fuso di destinazione. - Hai un timestamp con
Zo uno scarto numerico esplicito: analizza una sola volta il timestamp originale, quindi formatta l’istante risultante. - Hai solo una data civile: conservala come data, a meno che l’operazione non specifichi esplicitamente un’ora e un fuso.
- Hai una data e un’ora locali senza scarto: individua il fuso di origine e risolvi eventuali ambiguità prima di trattarle come un istante.
Per esempio, 2025-07-15 non permette di capire se la pubblicazione sia avvenuta prima o dopo la mezzanotte in un altro fuso. Assegnare la mezzanotte introdurrebbe un’ipotesi. Analogamente, una lettura dell’orologio locale può corrispondere a zero o a più istanti nei pressi di una transizione dello scarto; RFC 9557 documenta questo limite. Convertire un istante già stabilito evita il problema della mappatura inversa. RFC 9557, sezione 1.2.
Perché evitare di analizzare di nuovo il testo visualizzato?
Apple definisce Date di Foundation come un punto preciso nel tempo, indipendente da qualsiasi calendario o fuso orario. Il suo valore non deve diventare un altro Date per essere visualizzato in un fuso diverso. La formattazione fornisce il calendario e il fuso necessari per generare il testo. Date.
Un’etichetta visualizzata può omettere informazioni. Se formatti un istante come data senza l’ora e poi analizzi quell’etichetta, non puoi recuperare dal testo l’ora mancante. La documentazione di Apple sulla formattazione mostra un percorso di andata e ritorno con la sola data che ricostruisce la mezzanotte. È utile quando la mezzanotte è voluta, ma non conserva un istante di pubblicazione arbitrario. Date.FormatStyle.
Mantieni questa sequenza di operazioni:
- Leggi il timestamp originale oppure ottieni il
Dateesistente. - Conserva quell’istante come valore di lavoro.
- Scegli il fuso di destinazione, il calendario e la lingua di visualizzazione.
- Formatta l’istante conservato nell’etichetta finale.
Anche aggiungere manualmente uno scarto cambia l’operazione. Apple documenta addingTimeInterval(_:) come un metodo che crea una nuova data aggiungendo tempo trascorso. Aggiungere sette ore produce quindi un altro istante; scegliere il fuso del formattatore cambia la rappresentazione dell’istante originale. Date.
Esegui sul Mac un esempio completo con l’ora di pubblicazione
L’esempio richiede macOS 12 o versioni successive, in cui è disponibile l’API Date.FormatStyle di Apple, e una toolchain Swift funzionante. Usa Foundation, senza pacchetti aggiuntivi. Date.FormatStyle.
Apri il Terminale e controlla la toolchain:
swift --version
Se ti servono gli strumenti da riga di comando di Apple, esegui il comando seguente e completa la finestra di installazione. Apple documenta questa modalità di installazione e segnala che un’installazione completa di Xcode include già gli strumenti da riga di comando. Poi ripeti il controllo della versione. Installare gli strumenti da riga di comando.
xcode-select --install
In TextEdit, crea un nuovo documento e scegli Formato > Converti in testo semplice. Incolla il programma Swift completo riportato qui sotto e salvalo sulla Scrivania come publication-time.swift. Verifica che il nome del file risultante termini con .swift, senza un’estensione .txt aggiunta. La guida di Apple per TextEdit spiega come creare, convertire e salvare documenti di testo semplice. Creare, aprire e convertire documenti in TextEdit sul Mac.
Questo programma accetta il timestamp fornito con precisione al secondo, lo analizza una sola volta e crea tre rappresentazioni a partire dallo stesso instant. Apple documenta ISO8601DateFormatter per analizzare e generare rappresentazioni ISO 8601 e la sua opzione withInternetDateTime per il formato 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))")
Esegui il programma salvato:
swift "$HOME/Desktop/publication-time.swift"
Con i valori forniti, il timestamp nella zona di destinazione dovrebbe essere 2025-07-14T17:30:00-07:00 e la data di pubblicazione dovrebbe indicare il 14 luglio 2025. L’etichetta leggibile include anche l’ora e le informazioni sul fuso; la formulazione e la punteggiatura precise dipendono dal sistema di formattazione.
Il programma Swift è stato esaminato confrontandolo con la documentazione API consultata, ma non è stato eseguito nell’ambiente di ricerca perché Swift non era disponibile. Le conversioni numeriche degli esempi sono state verificate separatamente con le API di data, ora e fuso di Python.
Quali impostazioni controllano il risultato?
L’inizializzatore del formattatore accetta impostazioni separate per lingua, calendario e fuso orario. Qui, en_GB richiede le convenzioni di formattazione dell’inglese britannico, il calendario gregoriano fornisce il sistema di date e destination determina la data e l’ora locali. Cambia l’identificatore del fuso quando ti serve un’altra destinazione; cambia la lingua quando ti serve un’altra convenzione di presentazione. init(date:time:locale:calendar:timeZone:capitalizationContext:).
Anche il risultato con la sola data proviene direttamente da instant. Impostare time: .omitted rimuove l’ora dall’etichetta di output. Non è necessario creare un nuovo istante a mezzanotte.
Verifica i passaggi della mezzanotte e gli scarti stagionali
Usa i seguenti esempi sintetici per verificare se il risultato mantiene l’operazione prevista. Sono timestamp di pubblicazione illustrativi con le rappresentazioni calcolate nella zona di destinazione.
| Istante originale | Fuso di destinazione | Rappresentazione nella zona di destinazione |
|---|---|---|
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 |
Le prime due righe mostrano perché una correzione fissa non è sufficiente per una destinazione con fuso nominato: lo scarto applicabile può dipendere dall’istante. Le ultime due righe mostrano perché devi calcolare l’intera data di calendario della destinazione insieme all’ora. Una pubblicazione può apparire il giorno precedente, lo stesso giorno o il giorno successivo.
I fusi con nome usano le regole di un database dei fusi orari. IANA documenta che macOS usa il proprio database e che gli aggiornamenti raggiungono in genere i dispositivi tramite gli aggiornamenti del sistema operativo. Se i risultati differiscono tra computer, controlla gli identificatori dei fusi e gli aggiornamenti disponibili prima di modificare il timestamp di origine. Dati sui fusi orari e sull’ora legale.
Cosa fare se l’input o l’output è inatteso?
Procedi con questi controlli nell’ordine indicato:
- Verifica che la sorgente identifichi un istante. Conserva il suo
Zo lo scarto numerico. Un valore con la sola data o una lettura dell’orologio locale richiedono informazioni aggiuntive. - Verifica l’identificatore di destinazione. Usa un identificatore come
America/Los_Angeles. L’inizializzatore di Apple restituiscenilse l’identificatore non è noto; questo programma si interrompe con un errore invece di sostituire un altro fuso. - Controlla il formato supportato del timestamp. L’esempio è configurato per timestamp Internet con precisione al secondo. Per i secondi frazionari o un’altra rappresentazione di input serve una configurazione del parser adeguata. Conserva l’input originale mentre apporti questa modifica.
- Confronta il timestamp numerico nella zona di destinazione. Usa data, ora e scarto per valutare la conversione prima di esaminare la punteggiatura visualizzata.
- Verifica che ogni output usi il
instantoriginale. Rimuovi qualsiasi passaggio intermedio che formatti un’etichetta e poi la analizzi per la conversione successiva. init(identifier:), ISO8601DateFormatter.
In RFC 9557, un fuso con nome e uno scarto possono comparire insieme in un timestamp esteso. L’esistenza di questo standard non garantisce che il parser di questo esempio supporti le annotazioni di fuso tra parentesi quadre. Mantieni l’identificatore di destinazione nel valore separato destinationIdentifier usato sopra, a meno che tu non implementi e verifichi deliberatamente un percorso di input in formato esteso. RFC 9557.
Per un’etichetta di pubblicazione, conserva l’istante originale come valore riutilizzabile e genera da esso il testo per ciascuna destinazione. Così puoi cambiare il fuso di destinazione, la lingua di visualizzazione o i dettagli visibili, mantenendo ogni etichetta legata allo stesso momento di pubblicazione.
Fonti
- Date — Apple
- Date.FormatStyle — Apple
- init(date:time:locale:calendar:timeZone:capitalizationContext:) — Apple
- ISO8601DateFormatter — Apple
- withInternetDateTime — Apple
- init(identifier:) — Apple
- Installare gli strumenti da riga di comando — Apple
- Creare, aprire e convertire documenti in TextEdit sul Mac — Apple
- RFC 3339: Data e ora su Internet: timestamp — RFC Editor
- RFC 9557: Data e ora su Internet: timestamp con informazioni aggiuntive — RFC Editor
- Dati sui fusi orari e sull’ora legale — IANA