Bir yayınlanma anını başka bir saat diliminde biçimlendirmek için orijinal anı koruyun ve hedef saat dilimini biçimlendiriciye verin. Bu Mac Terminal kılavuzu, görüntülenen metni ayrıştırmadan veya saatleri elle eklemeden okunabilir bir yayın etiketi oluşturur.

Dönüştürmeden önce hangi bilgilere ihtiyacınız var?

Mac'inizde bir belge hazırladığınızı ve sentetik yayın zaman damgası 2025-07-15T00:30:00Z aldığınızı varsayalım. Yayın tarihini ve saatini America/Los_Angeles saat diliminde görüntülendiği biçimde istiyorsunuz. Görev, aynı anı hedefin takvim tarihi ve saatini kullanarak ifade etmektir.

Yeterli bilgiye sahip olup olmadığınızı dört terim belirler:

Terim Sentetik örnek Bu görev açısından anlamı
Takvim tarihi 2025-07-15 Saat veya saat dilimi içermeyen bir takvim günü
An 2025-07-15T00:30:00Z ile temsil edilen an Koruduğunuz zaman noktası
UTC farkı -07:00 Belirli bir andaki yerel saat ile UTC arasındaki fark
Adlandırılmış saat dilimi America/Los_Angeles Geçerli farkı belirlemek için kullanılan kurallar

RFC 3339, tam tarih, saat ve UTC farkı içeren zaman damgalarını tanımlar. RFC 9557 bu ayrımı daha ayrıntılı açıklar: adlandırılmış bir saat dilimi, bir anı bir farka eşleyen kurallar sağlar; zaman damgasındaki sayısal fark tek başına bir konumun diğer zamanlardaki farkının nasıl değiştiğini açıklamaz. RFC 3339, Bölüm 5.6, RFC 9557, Bölüm 1.2.

Dönüştürme işleminden önce bu girdi kararını verin:

  • Elinizde zaten bir Foundation Date varsa: doğrudan hedef saat dilimi için yapılandırılmış bir biçimlendiriciye verin.
  • Z veya açık bir sayısal fark içeren bir zaman damganız varsa: önce orijinal zaman damgasını ayrıştırın, ardından elde edilen anı biçimlendirin.
  • Yalnızca bir takvim tarihiniz varsa: görev açıkça bir saat ve saat dilimi belirtmediği sürece tarihi olduğu gibi koruyun.
  • Farksız yerel bir tarih ve saatiniz varsa: bunu bir an olarak değerlendirmeden önce kaynak saat dilimini edinin ve olası belirsizliği çözün.

Örneğin, 2025-07-15 yayının başka bir saat diliminde gece yarısından önce mi sonra mı gerçekleştiğini söyleyemez. Gece yarısını atamak varsayımda bulunmak olur. Benzer şekilde, yerel bir saat okuması fark geçişi sırasında sıfır veya birden fazla ana karşılık gelebilir; RFC 9557 bu sınır durumunu belgeler. Önceden belirlenmiş bir anı dönüştürmek, geriye dönük eşleme sorununu önler. RFC 9557, Bölüm 1.2.

Görüntüleme metnini neden yeniden ayrıştırmamalısınız?

Apple, Foundation Date türünü herhangi bir takvim veya saat diliminden bağımsız, belirli bir zaman noktası olarak tanımlar. Başka bir saat diliminde görünmesi için değerinin farklı bir Date olması gerekmez. Biçimlendirme, metin üretmek için gereken takvimi ve saat dilimini sağlar. Date.

Bir görüntüleme etiketi bazı bilgileri içermeyebilir. Bir anı saati olmadan tarih olarak biçimlendirip sonra bu etiketi ayrıştırırsanız, etikette bulunmayan saat geri kazanılamaz. Apple'ın biçimlendirme belgeleri, gece yarısını yeniden oluşturan yalnızca tarih içeren bir gidiş dönüş örneği gösterir. Gece yarısı amaçlandığında bu kullanışlıdır, ancak rastgele bir yayınlanma anını korumaz. Date.FormatStyle.

İşlemi şu sırayla yürütün:

  1. Orijinal zaman damgasını okuyun veya mevcut Date değerini alın.
  2. Bu anı çalışma değeri olarak koruyun.
  3. Hedef saat dilimini, takvimi ve görüntüleme yerel ayarını seçin.
  4. Korunan anı son etikete biçimlendirin.

Farkı elle eklemek de görevi değiştirir. Apple, addingTimeInterval(_:) işlevini geçen süreyi ekleyerek yeni bir tarih oluşturmak şeklinde belgeler. Bu nedenle yedi saat eklemek başka bir an üretir; biçimlendiricinin saat dilimini seçmek ise orijinal anın nasıl gösterileceğini değiştirir. Date.

Mac'inizde eksiksiz bir yayınlanma saati örneği çalıştırın

Örnek, Apple'ın Date.FormatStyle API'sinin kullanılabildiği macOS 12 veya daha yeni bir sürümü ve çalışan bir Swift araç zinciri gerektirir. Ek paket kullanmadan Foundation'ı kullanır. Date.FormatStyle.

Terminal'i açın ve araç zincirini denetleyin:

swift --version

Apple'ın komut satırı araçlarına ihtiyacınız varsa aşağıdaki komutu çalıştırıp kurulum iletişim kutusundaki adımları tamamlayın. Apple bu kurulum yöntemini belgeler ve tam bir Xcode kurulumunun komut satırı araçlarını zaten içerdiğini belirtir. Ardından sürüm denetimini tekrarlayın. Komut satırı araçlarını yükleme.

xcode-select --install

TextEdit'te yeni bir belge oluşturun ve Biçim > Düz Metin Yap seçeneğini belirleyin. Aşağıdaki Swift programının tamamını yapıştırın ve Masaüstünüze publication-time.swift adıyla kaydedin. Oluşan dosya adının sonuna .txt uzantısı eklenmeden .swift ile bittiğinden emin olun. Apple'ın TextEdit kılavuzu düz metin belgeler oluşturmayı, dönüştürmeyi ve kaydetmeyi açıklar. Mac'te TextEdit'te belgeler oluşturma, açma ve dönüştürme.

Bu program, verilen tam saniyeli zaman damgasını kabul eder, bir kez ayrıştırır ve aynı instant değerinden üç gösterim oluşturur. Apple, ISO 8601 gösterimlerini ayrıştırmak ve üretmek için ISO8601DateFormatter sınıfını ve RFC 3339 biçimi için withInternetDateTime seçeneğini belgeler. 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))")

Kaydedilen programı çalıştırın:

swift "$HOME/Desktop/publication-time.swift"

Verilen değerler için hedef zaman damgası 2025-07-14T17:30:00-07:00 olmalı ve yayın tarihi 14 Temmuz 2025'i göstermelidir. Okunabilir etiket ayrıca saat ve saat dilimi bilgisini de içerir; tam ifade ve noktalama biçimlendirme sistemine bağlıdır.

Swift programı, alınan API belgelerine göre incelendi ancak araştırma ortamında Swift bulunmadığı için çalıştırılmadı. Sayısal örnek dönüştürmeleri Python'ın tarih/saat ve saat dilimi API'leriyle ayrıca denetlendi.

Sonucu hangi ayarlar belirler?

Biçimlendirici başlatıcısı yerel ayar, takvim ve saat dilimi için ayrı ayarlar kabul eder. Burada en_GB İngiliz İngilizcesi biçimlendirme kurallarını ister, Gregoryen takvimi tarih sistemini sağlar ve destination yerel tarihi ve saat bilgisini belirler. Başka bir hedef gerektiğinde saat dilimi tanımlayıcısını, başka bir sunum biçimi gerektiğinde yerel ayarı değiştirin. init(date:time:locale:calendar:timeZone:capitalizationContext:).

Yalnızca tarihi içeren sonuç yine doğrudan instant değerinden gelir. time: .omitted ayarı, çıktı etiketindeki saati kaldırır. Gece yarısında yeni bir an oluşturmayı gerektirmez.

Gece yarısı geçişlerini ve mevsimsel farkları denetleyin

Sonucunuzun amaçlanan işlemi koruyup korumadığını denetlemek için aşağıdaki sentetik örnekleri kullanın. Bunlar, hesaplanmış hedef gösterimlerine sahip açıklayıcı yayın zaman damgalarıdır.

Orijinal an Hedef saat dilimi Hedef gösterim
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

İlk iki satır, adlandırılmış bir hedef için sabit bir düzeltmenin neden yetersiz olduğunu gösterir: geçerli fark ana bağlı olabilir. Son iki satır, hedefin saatinin yanı sıra tam takvim tarihini de neden hesaplamanız gerektiğini gösterir. Yayın önceki gün, aynı gün veya sonraki gün görünebilir.

Adlandırılmış saat dilimleri, saat dilimi veritabanındaki kuralları kullanır. IANA, macOS'un bu veritabanını kullandığını ve güncellemelerin genellikle işletim sistemi güncellemeleri aracılığıyla istemcilere ulaştığını belgeler. Sonuçlar makineler arasında farklılık gösteriyorsa kaynak zaman damgasını değiştirmeden önce saat dilimi tanımlayıcılarını ve kullanılabilir güncellemeleri denetleyin. Saat dilimi ve yaz saati verileri.

Girdi veya çıktı beklenmedikse ne yapmalısınız?

Şu denetimleri sırayla yapın:

  1. Kaynağın bir an tanımladığını doğrulayın. Z değerini veya sayısal farkı koruyun. Yalnızca tarih içeren bir değer ya da yerel saat okuması ek bilgi gerektirir.
  2. Hedef tanımlayıcıyı doğrulayın. America/Los_Angeles gibi bir tanımlayıcı kullanın. Apple'ın başlatıcısı bilinmeyen bir tanımlayıcı için nil döndürür; bu program başka bir saat dilimini kullanmak yerine hatayla durur.
  3. Zaman damgasının desteklenen biçimini denetleyin. Örnek, tam saniyeli internet zaman damgaları için yapılandırılmıştır. Kesirli saniyeler veya başka bir girdi gösterimi için uygun bir ayrıştırıcı yapılandırması gerekir. Bu değişikliği yaparken orijinal girdiyi koruyun.
  4. Sayısal hedef zaman damgasını karşılaştırın. Görüntüleme noktalamasını incelemeden önce dönüşümü değerlendirmek için tarihini, saatini ve farkını kullanın.
  5. Her çıktının orijinal instant değerini kullandığını denetleyin. Bir etiketi biçimlendirip sonraki dönüşüm için bu etiketi ayrıştıran ara adımları kaldırın. init(identifier:), ISO8601DateFormatter.

RFC 9557 kapsamında adlandırılmış bir saat dilimi ve fark, genişletilmiş bir zaman damgasında birlikte de taşınabilir. Bu standardın varlığı, bu örnekteki ayrıştırıcının köşeli parantez içindeki saat dilimi açıklamalarını desteklediği anlamına gelmez. Genişletilmiş biçimli bir girdi yolunu bilerek uygulayıp doğrulamadığınız sürece hedef tanımlayıcıyı yukarıda kullanılan ayrı destinationIdentifier değerinde tutun. RFC 9557.

Bir yayın etiketi için orijinal anı yeniden kullanılabilir değer olarak koruyun ve her hedefin metnini bu değerden üretin. Böylece her etiketi aynı yayınlanma anına bağlı tutarken hedef saat dilimini, görüntüleme dilini veya görünür ayrıntıları değiştirebilirsiniz.

Kaynaklar