Untuk menolak bilangan jam yang tepat daripada cap masa UTC pada Mac anda, huraikannya dengan ofset UTC, tolak tempoh masa, kemudian keluarkan hasil dalam UTC secara jelas. Aliran kerja Terminal ini menggunakan Python dan tarikh penerbitan sintetik.

Tugas ini khusus: undurkan cap masa penerbitan sebanyak bilangan jam bulat bukan negatif sambil memastikan input dan output kekal dalam UTC. Contohnya, menolak tujuh jam daripada 2026-05-12T02:30:00Z menghasilkan 2026-05-11T19:30:00Z.

“tepat” mengikut model datetime Python yang didokumenkan: satu jam ialah 3,600 saat, dan saat lompat tidak diwakili. Oleh itu, aliran kerja ini sesuai untuk cap masa penerbitan biasa; pengiraan yang perlu mengambil kira saat lompat memerlukan model masa yang berbeza. Dokumentasi datetime Python

Apakah jenis tarikh yang anda mulakan?

Sebelum mengira, bezakan tarikh kalendar daripada cap masa. Tarikh seperti 2026-05-12 tidak memberitahu bila penerbitan berlaku. Menambah waktu tengah malam atau mengandaikan zon waktu setempat Mac anda akan memasukkan maklumat yang tiada dalam input.

Konsep Contoh sintetik Maklumat yang diberikan
Tarikh sivil 2026-05-12 Hari kalendar tanpa waktu atau ofset
Tarikh dan waktu setempat 2026-05-12T02:30:00 Medan jam tanpa konteks yang mencukupi untuk mengenal pasti suatu detik
Detik yang dinyatakan dalam UTC 2026-05-12T02:30:00Z Titik masa yang khusus
Ofset angka +00:00 Perbezaan yang dinyatakan daripada UTC
Zon waktu bernama Europe/Paris Peraturan untuk mengaitkan bacaan jam setempat dengan UTC

Ofset dan zon bernama mempunyai tujuan yang berbeza. Ofset angka menerangkan hubungan cap masa dengan UTC; zon bernama menyediakan peraturan yang boleh berubah mengikut tarikh. RFC 9557 mentakrifkan perbezaan ini dan menjelaskan sebab sesetengah bacaan jam setempat boleh sepadan dengan sifar atau beberapa detik. RFC 9557, takrifan

Gunakan cap masa lengkap untuk tugas ini. Program di bawah menerima T huruf besar, saat, pecahan saat pilihan yang terdiri daripada satu hingga enam digit, serta sama ada Z atau +00:00. Ini ialah subset RFC 3339 yang sengaja dihadkan; tatabahasa cap masanya juga membenarkan ofset lain dan bilangan digit pecahan yang lebih banyak. RFC 3339, format tarikh/masa

Bagaimanakah anda menolak jam dalam Terminal?

Sediakan Python pada Mac anda

Buka Finder, pergi ke /Applications/Utilities, kemudian klik dua kali Terminal. Apple mendokumenkan cara ini untuk membuka aplikasi baris perintah. Buka atau keluar daripada Terminal pada Mac

Masukkan perintah ini dan tekan Return:

python3 --version

Gunakan Python 3.11 atau lebih baharu untuk panduan ini. Jika penterjemah yang sesuai tidak tersedia, ikut arahan pemasangan macOS rasmi: dapatkan pemasang Python yang disokong daripada halaman muat turun macOS yang dipautkan, buka fail .pkg-nya dan lengkapkan langkah pemasangan yang didokumenkan. Kemudian buka tetingkap Terminal baharu dan semak versinya sekali lagi. Dokumentasi Python menerangkan pemasangan dan cara menjalankan Python daripada shell. Menggunakan Python pada macOS

Jalankan pengiraan lengkap

Salin seluruh blok di bawah ke dalam Terminal, termasuk baris pertama dan terakhirnya, kemudian tekan Return. Untuk pengiraan lain, ubah hanya source_timestamp dan hours_to_subtract sebelum menampalnya. Pastikan cap masa berada dalam tanda petik dan masukkan jam sebagai integer.

python3 - <<'PY'
import re
from datetime import datetime, timedelta, timezone

source_timestamp = "2026-05-12T02:30:00Z"
hours_to_subtract = 7

def subtract_utc_hours(text, hours):
    if type(hours) is not int or hours < 0:
        raise ValueError("Hours must be a non-negative whole number.")

    match = re.fullmatch(
        r"[0-9]{4}-[0-9]{2}-[0-9]{2}T"
        r"[0-9]{2}:[0-9]{2}:[0-9]{2}"
        r"(?P<fraction>\.[0-9]{1,6})?(?:Z|\+00:00)",
        text,
    )
    if match is None:
        raise ValueError(
            "Use YYYY-MM-DDTHH:MM:SS, optionally .ffffff, "
            "ending in Z or +00:00."
        )

    normalized = text[:-1] + "+00:00" if text.endswith("Z") else text
    start = datetime.fromisoformat(normalized).astimezone(timezone.utc)
    try:
        result = start - timedelta(hours=hours)
    except OverflowError as exc:
        raise ValueError(
            "The duration or result is outside the supported range."
        ) from exc

    # Whole-hour subtraction leaves the fractional second unchanged.
    seconds_text = result.isoformat(timespec="seconds")
    return seconds_text[:-6] + (match.group("fraction") or "") + "Z"

try:
    print(subtract_utc_hours(source_timestamp, hours_to_subtract))
except ValueError as exc:
    raise SystemExit(f"Cannot subtract: {exc}")
PY

Output untuk cap masa penerbitan sintetik yang diberikan ialah:

2026-05-11T19:30:00Z

Ini program lengkap yang menggunakan pustaka standard Python. Program ini mencetak cap masa yang dikira tanpa mencipta fail. Salin hasilnya ke medan tarikh penerbitan atau dokumen yang sedang anda sediakan.

Turutan API ialah datetime.fromisoformat(), penukaran kepada timezone.utc, penolakan timedelta(hours=hours), dan output melalui isoformat(). Python mendokumenkan operasi penghuraian, zon waktu, tempoh dan pemformatan ini. API datetime Python

Bagaimanakah program mengekalkan UTC dan pecahan saat?

Semakan input memerlukan perwakilan UTC yang jelas. Cap masa tanpa ofset akan terus ditolak, jadi program tidak perlu membuat andaian tentang zon daripada tetapan Mac anda. Kedua-dua akhiran yang diterima dihuraikan sebagai cap masa berofset sifar, dan output sentiasa ditulis dengan Z.

Mengekalkan UTC tidak bermakna mengekalkan setiap aksara rentetan asal. Input yang berakhir dengan +00:00 akan dikembalikan dengan akhiran Z. Hasilnya kekal dalam perwakilan UTC, sementara tarikh dan waktunya diundurkan mengikut tempoh yang diminta.

Program ini juga mengekalkan teks pecahan saat yang diberikan. Menolak jam penuh tidak mengubah pecahan itu, jadi .120 kekal sebagai .120, bukannya menjadi .12 atau hilang. Input dengan lebih daripada enam digit pecahan akan ditolak, bukannya dipendekkan.

Terdapat nuansa piawaian yang berguna: Z mewakili ofset UTC sifar, tetapi tidak menentukan zon waktu lokasi asal. RFC 9557 mengemas kini tafsiran Z dalam RFC 3339 untuk membolehkan ofset setempat yang tidak diketahui. Program ini menerima Z dan +00:00 secara sengaja; program ini menolak -00:00 sebagai pilihan dasar input. RFC 9557, kemas kini kepada RFC 3339

Bagaimanakah anda boleh menyemak hasil sebelum menggunakannya?

Mulakan dengan pengiraan yang melangkaui tengah malam. Dalam contoh utama, bergerak ke belakang dua jam menghasilkan 00:30:00 pada 12 Mei; bergerak ke belakang lima jam lagi menghasilkan 19:30:00 pada 11 Mei. Hasil yang kekal pada 12 Mei adalah tidak betul.

Contoh sintetik ini menyediakan semakan tambahan. Ubah dua nilai input dalam program lengkap untuk menghasilkan setiap baris.

Input UTC Jam yang ditolak Output UTC yang dijangka
2026-05-12T02:30:00Z 7 2026-05-11T19:30:00Z
2026-01-01T00:15:00+00:00 1 2025-12-31T23:15:00Z
2028-03-01T00:30:00Z 1 2028-02-29T23:30:00Z
2026-05-12T02:30:00.120Z 7 2026-05-11T19:30:00.120Z
2026-05-12T02:30:00Z 0 2026-05-12T02:30:00Z

Bagi contoh utama, selangnya ialah tujuh kali 3,600, iaitu 25,200 saat. Minit dan saat kekal sama kerana tempoh yang diminta hanya mengandungi jam penuh. Tarikh boleh berubah apabila melangkaui tengah malam, sempadan bulan atau sempadan tahun.

Apakah yang patut anda lakukan apabila input ditolak?

Gunakan penolakan itu sebagai langkah diagnostik. Selesaikan maklumat yang tiada atau ketepatan yang tidak disokong sebelum mencuba lagi.

  • Hanya tarikh tersedia: Dapatkan waktu penerbitan yang dimaksudkan dan ofsetnya. Tarikh sivil sahaja tidak dapat mengenal pasti detik permulaan.
  • Cap masa tiada ofset: Pastikan sama ada cap masa itu mewakili UTC atau waktu setempat sebelum menambah akhiran.
  • Cap masa mempunyai ofset bukan sifar: Tukarkan detik yang diwakilinya kepada UTC dahulu. Mengubah akhiran sahaja akan mengubah maknanya.
  • Terdapat lebih daripada enam digit pecahan: Gunakan alat yang mengekalkan ketepatan itu, atau tetapkan dasar pembundaran secara jelas sebelum menggunakan aliran kerja ini.
  • Jam bernilai negatif atau pecahan: Berikan integer bukan negatif. Program ini sengaja melaksanakan penolakan jam penuh.
  • Medan kalendar tidak sah: Betulkan nilai sumber. Tarikh yang mustahil seperti 30 Februari akan ditolak.

Python menyokong tahun datetime dari 1 hingga 9999; penolakan yang melangkaui julat itu akan gagal. Model datetime Python juga menolak medan saat bernilai 60, walaupun RFC 3339 membenarkan nilai tersebut untuk saat lompat dalam keadaan tertentu. Had datetime Python, RFC 3339, sekatan

Jika keperluan sebenar anda ialah “waktu jam setempat yang sama pada hari sebelumnya,” gunakan aliran kerja kalendar berasaskan zon bernama. Ofset zon bernama boleh berubah merentas peralihan waktu penjimatan siang, jadi tugas itu boleh berbeza daripada menolak 24 jam yang berlalu. Dokumentasi zoneinfo Python menunjukkan aritmetik merentas peralihan sedemikian. Sokongan zon waktu IANA Python

Bagi cap masa penerbitan yang sudah dinyatakan dalam UTC, kekalkan operasi yang ringkas: sahkan input, tolak tempoh jam penuh, dan kekalkan akhiran UTC yang jelas pada nilai yang anda salin. Semak sempadan tarikh dan ketepatan pecahan sebelum menggunakan hasilnya.

Sumber