Yalnızca tarih içeren bir yayın değerini takvim tarihi olarak ayrıştırıp bu tarihi esas alarak koruyun. Dışa aktarma UTC zaman damgası gerektiriyorsa açık bir UTC gece yarısı kuralı ekleyin. Bu Mac Terminal uygulamalı kılavuzu, aradaki farkı gösterir ve gidiş dönüşü sınar.

Yayın alanının gerçekte ne anlama geldiğine karar verin

Bir yayın listesinin sentetik 2028-06-15 değerini içerdiğini varsayalım. Göreviniz, bu değeri doğrulamak ve yanlışlıkla 14 Haziran olarak görüntülemeden dışa aktarıma hazırlamaktır. Bir ayrıştırıcı seçmeden önce alanın yayın gününü mü yoksa gerçek bir yayın anını mı kaydettiğine karar verin.

Bu dört kavramın rolleri farklıdır:

Kavram Sentetik örnek Anlamı
Takvim tarihi 2028-06-15 Saat veya ofset içermeyen bir takvim günü
An 2028-06-15T00:00:00+00:00 UTC olarak ifade edilen belirli bir an
UTC ofseti +09:00 Yerel saat gösterimi ile UTC arasındaki fark
Adlandırılmış saat dilimi America/Los_Angeles Uygulanabilir saat dilimi kurallarını almak için kullanılan bir tanımlayıcı

RFC 3339, full-date ile date-time kavramlarını ayrı ayrı tanımlar; zaman damgası sözdizimi tarihe saat ve ofset ekler. Bu nedenle yalın bir yayın tarihi, yayın anını belirlemek için gereken bilgiden yoksundur. Gece yarısını seçmek, girdide bulunmayan bir bilgiyi ekler. RFC 3339, bölüm 5.6

Adlandırılmış bir saat dilimi, tek bir sayısal ofsetten daha fazla bilgi taşır. Python’un zoneinfo belgeleri, yaz saati geçişinde bir saat diliminin farklı ofsetler kullanabileceğini gösterir. Yalnızca tarih içeren bir etiket için bu kuralları çözümlemeye gerek yoktur. Python: IANA saat dilimi desteği

Dışa aktarmadan önce şu karar kuralını kullanın:

  • Alan “bu gün yayımlandı” anlamına geliyorsa: Depolama ve görüntüleme boyunca yalnızca tarih içeren değeri koruyun.
  • Alıcı biçim zaman damgası gerektiriyorsa: Tarihi koruyun ve belgelenmiş bir kural uyarınca UTC gece yarısı taşıyıcı değeri türetin.
  • Alan “bu anda yayımlandı” anlamına geliyorsa: Gerçek saat ve ofseti ya da o anı belirlemek için gereken saat ve adlandırılmış saat dilimini edinin.

Taşıyıcı kuralı uyumluluk açısından kullanışlıdır, ancak bilinmeyen yayın saatini ortaya çıkarmaz. utc_carrier gibi bir alan adı bu sınırlamayı görünür kılar; alanı published_at olarak adlandırmak, kaynağın hiç sağlamadığı bir bilgiye sahipmiş izlenimi verir.

Önceki gün hatasının nerede ortaya çıktığını anlayın

2028-06-15 için iki olası işleme yolunu ele alalım. İlkinde bir program sabit +09:00 ofsetinde gece yarısını varsayar ve ardından bu anı UTC’ye dönüştürür. Sonuç 2028-06-14T15:00:00+00:00 olur: dokuz saatin çıkarılması tarih sınırını aşar.

İkinci yolda program kasıtlı olarak UTC gece yarısı oluşturur: 2028-06-15T00:00:00+00:00. Aynı anın sabit -07:00 ofsetinde gösterilmesi 2028-06-14T17:00:00-07:00 sonucunu verir. Bunlar örnek niteliğinde ofset hesaplamalarıdır; söz konusu tarihte adlandırılmış bir saat diliminin ofsetine ilişkin iddia değildir.

Her iki hesaplama da kendi anlarını korur. Ancak hiçbiri tüm görüntüleme saat dilimlerinde özgün takvim etiketini korumaz. Python, astimezone() işleminin temsil edilen UTC zamanını korurken saat alanlarını ayarladığını belgeler. Python: datetime.astimezone()

Bunun pratik sonucu, ayrıştırma ve görüntülemenin ortak bir sözleşmeye dayanması gerektiğidir. Bir tarih UTC gece yarısı taşıyıcısına yerleştirildiyse takvim alanlarını UTC’de geri alın. Dışa aktarmayı kim açarsa açsın yayın etiketinin değişmeden kalmasını istiyorsanız, saklanan takvim tarihini görüntüleyin.

Her dilin eksik bilgileri aynı şekilde sağladığını varsaymayın. ECMAScript, ofsetsiz ve yalnızca tarih içeren biçimlerin UTC olarak; ofsetsiz tarih-saat biçimlerinin ise yerel saat olarak yorumlanacağını belirtir. Bir dizenin sonuna T00:00:00 eklemek, JavaScript’te yorumunu değiştirebilir. ECMAScript: Date.parse

Mac Terminal’de eksiksiz bir yayın tarihi denetimi yapın

Bu uygulamalı kılavuz üç sentetik tarihi doğrular, sekmeyle ayrılmış bir önizleme yazdırır ve bozuk girdilerin reddedilmesini sınar. Bir yayın listesini değiştirmez veya dışa aktarma dosyası oluşturmaz.

Finder’da /Applications/Utilities klasörünü açın, ardından Terminal’a çift tıklayın. Apple, komut satırı uygulamasını açmak için bunu desteklenen bir yöntem olarak belgeliyor. Apple: Mac’te Terminal’i açma veya kapatma

Yorumlayıcınızı denetlemek için şu komutu çalıştırın:

python3 --version

Bu kılavuz için Python 3.11 veya daha yenisini kullanın. python3 kullanılamıyorsa veya daha eski bir sürüm bildiriyorsa, devam etmeden önce macOS için resmi kurulum yönergelerini izleyin; ardından Terminal’ı yeniden açıp tekrar denetleyin. Python, hem macOS yükleyicisini hem de python3 ile betik çalıştırmayı belgeliyor. Python: macOS’ta Python kullanımı

Aşağıdaki bloğun tamamını, sonundaki PY dahil olmak üzere yapıştırıp Return tuşuna basın. - bağımsız değişkeni, Python’a programını standart girdiden okumasını söyler. Örnek verilerin ve içe aktarımların tümü bloğa dahildir. Python: Komut satırı ve ortam

python3 - <<'PY'
import re
from datetime import date, datetime, time, timezone


def parse_publication_date(text):
    if not isinstance(text, str) or re.fullmatch(
        r"[0-9]{4}-[0-9]{2}-[0-9]{2}", text
    ) is None:
        raise ValueError("Expected YYYY-MM-DD")
    return date.fromisoformat(text)


def utc_carrier(day):
    return datetime.combine(day, time(0), tzinfo=timezone.utc)


samples = ["2028-02-29", "2028-06-15", "2028-12-31"]
parsed = [(text, parse_publication_date(text)) for text in samples]

print("publication_date\tutc_carrier")
for original, day in parsed:
    carrier = utc_carrier(day)
    assert day.isoformat() == original
    assert carrier.astimezone(timezone.utc).date() == day
    print(day.isoformat(), carrier.isoformat(timespec="seconds"), sep="\t")

for invalid in [
    "2027-02-29",
    "2028-6-15",
    "2028-06-15T00:00:00",
    " 2028-06-15",
]:
    try:
        parse_publication_date(invalid)
    except ValueError:
        pass
    else:
        raise AssertionError(f"Unexpected acceptance: {invalid!r}")

print("Round-trip and rejection checks passed.")
PY

Beklenen çıktı şöyledir:

publication_date	utc_carrier
2028-02-29	2028-02-29T00:00:00+00:00
2028-06-15	2028-06-15T00:00:00+00:00
2028-12-31	2028-12-31T00:00:00+00:00
Round-trip and rejection checks passed.

Örnek ve iki sabit ofset hesabı, kullanılabilir Python yorumlayıcısıyla başarıyla çalıştırıldı. Mac’e özgü açılış ve yorumlayıcı yönergeleri, bağlantısı verilen resmi belgeleri izler.

Örneğin yayın gününü neden koruduğu

Ayrıştırıcı iki şeyi ayrı ayrı denetler: dizenin tam biçimini ve takvimde geçerli olup olmadığını. Düzenli ifade dört yıl basamağı, iki ay basamağı ve iki gün basamağı gerektirir. Ardından tarih ayrıştırıcısı olanaksız tarihleri reddeder. Böylece bir yayın sütununun sessizce zaman damgalarını, baştaki veya sondaki boşlukları ya da kısaltılmış girdileri kabul etmesi önlenir.

Bu açık biçim denetimi önemlidir; çünkü date.fromisoformat() kısa tarih ve hafta tarihleri de dahil olmak üzere başka ISO gösterimlerini kabul eder. datetime.combine() daha sonra gece yarısını ve UTC’yi kasıtlı olarak ekler. Python: Temel tarih ve saat türleri

Program başlığı yazdırmadan önce örnek listesinin tamamını ayrıştırır. Bir örneği geçersiz bir değerle değiştirirseniz herhangi bir önizleme satırı görünmeden çalıştırma durur. Sondaki kasıtlı geçersiz girdi denetimleri ayrı testlerdir; beklenen istisnalar yakalanır, böylece tüm ret durumları denetlenebilir.

İki gidiş dönüş doğrulaması sözleşmeyi ifade eder. İlki, ayrıştırma ve tarih biçimlendirmenin özgün etiketi yeniden ürettiğini doğrular. İkincisi, türetilen taşıyıcının UTC’de yorumlandığında aynı tarihi verdiğini doğrular. Bir zaman damgası üretilebildiğini denetlemek yerine, birlikte tam olarak koruma görevini sınarlar.

Çıktı açıkça +00:00 kullanır. RFC 3339, UTC ofseti belirteci olarak Z kullanımına da izin verir; ancak bu eklerden herhangi birini yalın bir tarihe eklemek eksik saat bileşenini sağlamaz. Yalnızca tarih içeren biçimi koruyun veya tam zaman damgasını bilinçli olarak oluşturun. RFC 3339, bölüm 5.6

Tarihi değiştirmeye devam eden bir dışa aktarımı teşhis edin

Sonraki aşamadaki bir önizlemede önceki gün görünüyorsa her sınırdaki değerleri inceleyin. Tüm aşamaları bilinen tek bir etiketle karşılaştırmak için sentetik orta örnek olan 2028-06-15 değerini kullanın.

Denetim noktası Taşıyıcı kuralına göre beklenen Farklılık neye işaret eder?
Özgün yayın alanı 2028-06-15 Girdi ayrıştırmadan önce değişti
Metin olarak gösterilen ayrıştırılmış tarih 2028-06-15 Ayrıştırma veya normalleştirme etiketi değiştirdi
Türetilen UTC taşıyıcısı 2028-06-15T00:00:00+00:00 Farklı bir saat veya ofset eklendi
UTC’de geri alınan tarih 2028-06-15 Dönüştürme veya çıkarma sırasında yanlış sözleşme kullanıldı
Okuyucuya gösterilen yayın etiketi 2028-06-15 Görüntüleyici taşıyıcıyı başka bir saat diliminde gösteriyor olabilir

Görüntüleyiciyi ayrıştırıcıdan bağımsız olarak denetleyin. Doğru bir UTC taşıyıcısı bile yerel saat dilimi ayarıyla görüntülendiğinde farklı bir takvim günü üretebilir. Yayın etiketi için görüntüleyiciye saklanan yalnızca tarih içeren değeri verin. Yalnızca zaman damgalarını kabul ediyorsa belgelenmiş bir UTC görüntüleme seçeneği kullanın ve sonucu doğrulayın.

Alıcı araç yalnızca anları destekliyor ve bunları her zaman yerel olarak görüntülüyorsa UTC gece yarısı kuralı, tarih etiketinin değişmeden kalmasını garanti edemez. Ayrı bir yalnızca tarih içeren metin sütunu saklayın, desteklenen bir yalnızca tarih alanı kullanın veya açık UTC biçimlendirmesi olan bir görüntüleyici seçin. Sınırlama yukarıdaki ofset hesaplamalarından kaynaklanır; yalnızca ayrıştırıcıyı değiştirmek bunu ortadan kaldıramaz.

Mevcut bir zaman damgasını yalnızca tarih içeren bir girdiymiş gibi ele almaktan da kaçının. Gerçek bir an söz konusuysa saat dilimini değiştirmek, onu dönüştirmek anlamına gelir. Python bu işlemi, saat alanlarını ayarlamadan saat dilimi bilgisini ekleyen tzinfo işleminden ayrı tutar. Python: Saat dilimi dönüştürme davranışı

Yayın listenizde publication_date değerini esas alınacak takvim değeri olarak tutun. UTC taşıyıcısını yalnızca bir arayüz gerektirdiğinde türetin, kuralı alanla birlikte taşıyın ve önizlemeye güvenmeden önce UTC’de çıkarımı doğrulayın. Böylece bir yayın anı uydurmadan sağlanan günü korumak için tekrarlanabilir bir yol elde edersiniz.

Kaynaklar