Om du vill formatera ett publiceringsögonblick i en annan tidszon behåller du det ursprungliga ögonblicket och anger destinationszonen för formateraren. Den här guiden för Mac Terminal skapar en lättläst publiceringsetikett utan att tolka visad text eller lägga till timmar manuellt.
Vilken information behöver du innan du konverterar?
Anta att du förbereder ett dokument på din Mac och får den syntetiska publiceringstidsstämpeln 2025-07-15T00:30:00Z. Du behöver publiceringsdatumet och tiden så som de visas i America/Los_Angeles. Uppgiften är att beskriva samma ögonblick med destinationens kalenderdatum och klockslag.
Fyra termer avgör om du har tillräckligt med information:
| Term | Syntetiskt exempel | Betydelse för den här uppgiften |
|---|---|---|
| Kalenderdatum | 2025-07-15 |
En kalenderdag, utan tid eller tidszon |
| Ögonblick | Ögonblicket som representeras av 2025-07-15T00:30:00Z |
Tidpunkten du bevarar |
| UTC-offset | -07:00 |
Skillnaden mellan lokal tid och UTC vid en viss tidpunkt |
| Namngiven tidszon | America/Los_Angeles |
Reglerna som används för att fastställa den tillämpliga offseten |
RFC 3339 definierar tidsstämplar som innehåller ett fullständigt datum, en tid och en UTC-offset. RFC 9557 förklarar den ytterligare skillnaden: en namngiven zon tillhandahåller regler som mappar ett ögonblick till en offset, medan en tidsstämplings numeriska offset i sig inte beskriver hur en plats offset förändras vid andra tidpunkter. RFC 3339, avsnitt 5.6, RFC 9557, avsnitt 1.2.
Använd det här beslutstödet för indata innan du gör någon konvertering:
- Du har redan en Foundation-
Date: skicka den direkt till en formaterare som konfigurerats för destinationszonen. - Du har en tidsstämpel med
Zeller en uttrycklig numerisk offset: tolka den ursprungliga tidsstämpeln en gång och formatera sedan det resulterande ögonblicket. - Du har bara ett kalenderdatum: bevara det som ett datum, såvida uppgiften inte uttryckligen anger en tid och tidszon.
- Du har ett lokalt datum och klockslag utan offset: ta reda på källzonen och lös eventuell tvetydighet innan du behandlar värdet som ett ögonblick.
Exempelvis kan 2025-07-15 inte tala om ifall publiceringen skedde före eller efter midnatt i en annan zon. Om du tilldelar midnatt inför du ett antagande. På samma sätt kan en lokal klocktid motsvara noll eller flera ögonblick kring en offsetövergång; RFC 9557 beskriver den gränssituationen. Omvandling av ett redan fastställt ögonblick undviker det problemet med omvänd mappning. RFC 9557, avsnitt 1.2.
Varför bör du undvika att tolka visningstext på nytt?
Apple definierar Foundations Date som en specifik tidpunkt som är oberoende av kalender och tidszon. Dess värde behöver inte bli ett annat Date-värde för att visas i en annan zon. Formatering tillför kalendern och tidszonen som behövs för att skapa text. Date.
En visningsetikett kan utelämna information. Om du formaterar ett ögonblick som ett datum utan dess klockslag och sedan tolkar etiketten, går det inte att återställa den utelämnade tiden från etiketten. Apples dokumentation om formatering visar en tur och retur med endast datum, som återskapar midnatt. Det är användbart när midnatt är avsedd, men bevarar inte ett godtyckligt publiceringsögonblick. Date.FormatStyle.
Behåll operationerna i den här ordningen:
- Läs den ursprungliga tidsstämpeln eller hämta det befintliga
Date-värdet. - Behåll det ögonblicket som arbetsvärde.
- Välj destinationszon, kalender och visningsspråk.
- Formatera det bevarade ögonblicket till den slutliga etiketten.
Att lägga till en offset manuellt förändrar också uppgiften. Apple beskriver addingTimeInterval(_:) som ett sätt att skapa ett nytt datum genom att lägga till förfluten tid. Om du lägger till sju timmar får du alltså ett annat ögonblick; om du väljer en tidszon i formateraren ändras hur det ursprungliga ögonblicket representeras. Date.
Kör ett fullständigt exempel på publiceringstid på din Mac
Exemplet kräver macOS 12 eller senare, där Apples API Date.FormatStyle finns tillgängligt, och en fungerande Swift-verktygskedja. Det använder Foundation utan ytterligare paket. Date.FormatStyle.
Öppna Terminal och kontrollera verktygskedjan:
swift --version
Om du behöver Apples kommandoradsverktyg kör du följande kommando och slutför installationsdialogen. Apple dokumenterar den här installationsvägen och noterar att en fullständig Xcode-installation redan innehåller kommandoradsverktygen. Kontrollera sedan versionen igen. Installera kommandoradsverktygen.
xcode-select --install
Skapa ett nytt dokument i TextEdit och välj Format > Gör till oformaterad text. Klistra in hela Swift-programmet nedan och spara det på skrivbordet som publication-time.swift. Kontrollera att filnamnet slutar på .swift och inte har fått tillägget .txt. Apples TextEdit-guide beskriver hur du skapar, konverterar och sparar dokument i oformaterad text. Skapa, öppna och konvertera dokument i TextEdit på Mac.
Programmet tar emot den angivna tidsstämpeln med hela sekunder, tolkar den en gång och skapar tre representationer från samma instant. Apple dokumenterar ISO8601DateFormatter för att tolka och skapa ISO 8601-representationer samt alternativet withInternetDateTime för formatet 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))")
Kör det sparade programmet:
swift "$HOME/Desktop/publication-time.swift"
För de angivna värdena ska destinationens tidsstämpel vara 2025-07-14T17:30:00-07:00, och publiceringsdatumet ska motsvara 14 juli 2025. Den lättlästa etiketten innehåller även tiden och tidszonsinformationen; dess exakta ordalydelse och interpunktion bestäms av formateringssystemet.
Swift-programmet granskades mot den hämtade API-dokumentationen men kördes inte i forskningsmiljön eftersom Swift saknades. De numeriska konverteringsexemplen kontrollerades separat med Pythons datum-, tids- och tidszons-API:er.
Vilka inställningar styr resultatet?
Formaterarens initialiserare tar emot separata inställningar för språkvariant, kalender och tidszon. Här begär en_GB brittisk-engelska formateringskonventioner, den gregorianska kalendern anger datumsystemet och destination avgör det lokala datumet och klockslaget. Ändra zonidentifieraren när du behöver en annan destination och språkvarianten när du behöver en annan presentationskonvention. init(date:time:locale:calendar:timeZone:capitalizationContext:).
Resultatet som bara innehåller datum kommer fortfarande direkt från instant. Om du anger time: .omitted tas tiden bort från utdataetiketten. Det kräver inte att ett nytt ögonblick skapas vid midnatt.
Kontrollera midnattsövergångar och säsongsbundna offsetar
Använd följande syntetiska exempel för att kontrollera om resultatet bevarar den avsedda operationen. Exemplen visar illustrativa publiceringstidsstämplar med beräknade representationer i destinationszonerna.
| Ursprungligt ögonblick | Destinationszon | Representation i destinationszonen |
|---|---|---|
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 |
De två första raderna visar varför en fast justering inte räcker för en namngiven destination: den tillämpliga offseten kan bero på tidpunkten. De två sista raderna visar varför du måste räkna fram destinationens fullständiga kalenderdatum tillsammans med tiden. En publicering kan visas på föregående dag, samma dag eller följande dag.
Namngivna zoner använder regler från en tidszonsdatabas. IANA dokumenterar att macOS använder dess databas och att uppdateringar vanligtvis når klienter via operativsystemuppdateringar. Om resultaten skiljer sig mellan datorer bör du kontrollera deras zonidentifierare och tillgängliga uppdateringar innan du ändrar källans tidsstämpel. Tidszons- och sommartidsdata.
Vad ska du göra när indata eller utdata är oväntade?
Gå igenom de här kontrollerna i ordning:
- Bekräfta att källan identifierar ett ögonblick. Behåll dess
Zeller numeriska offset. Ett värde med endast datum eller en lokal klocktid kräver ytterligare information. - Bekräfta destinationsidentifieraren. Använd en identifierare som
America/Los_Angeles. Apples initialiserare returnerarnilför en okänd identifierare; det här programmet avbryts med ett fel i stället för att använda en annan zon. - Kontrollera vilken form av tidsstämpel som stöds. Exemplet är konfigurerat för internettidsstämplar med hela sekunder. Bråkdelar av sekunder eller en annan indatarymning kräver en lämplig parserkonfiguration. Bevara ursprungsindatan när du gör den ändringen.
- Jämför den numeriska tidsstämpeln i destinationszonen. Använd datumet, tiden och offseten för att bedöma konverteringen innan du undersöker interpunktionen i visningen.
- Kontrollera att varje utdata använder det ursprungliga
instant. Ta bort eventuella mellanliggande steg som formaterar en etikett och sedan tolkar den etiketten för nästa konvertering. init(identifier:), ISO8601DateFormatter.
En namngiven zon och en offset kan även förekomma tillsammans i en utökad tidsstämpel enligt RFC 9557. Att standarden finns innebär inte att det här exemplet hanterar hakparentesomslutna zonanteckningar i sin parser. Behåll destinationsidentifieraren i det separata värdet destinationIdentifier som används ovan, såvida du inte uttryckligen implementerar och verifierar en indataväg för det utökade formatet. RFC 9557.
För en publiceringsetikett behåller du det ursprungliga ögonblicket som återanvändbart värde och skapar varje destinations text utifrån det. Då kan du ändra destinationszon, visningsspråk eller synliga detaljer samtidigt som alla etiketter förblir knutna till samma publiceringsögonblick.
Källor
- Date — Apple
- Date.FormatStyle — Apple
- init(date:time:locale:calendar:timeZone:capitalizationContext:) — Apple
- ISO8601DateFormatter — Apple
- withInternetDateTime — Apple
- init(identifier:) — Apple
- Installera kommandoradsverktygen — Apple
- Skapa, öppna och konvertera dokument i TextEdit på Mac — Apple
- RFC 3339: Datum och tid på internet: tidsstämplar — RFC Editor
- RFC 9557: Datum och tid på internet: tidsstämplar med ytterligare information — RFC Editor
- Tidszons- och sommartidsdata — IANA