Untuk mengurangi jumlah jam yang tepat dari stempel waktu UTC di Mac, parsing stempel waktu beserta offset UTC-nya, kurangi durasi, lalu keluarkan hasilnya secara eksplisit dalam UTC. Alur kerja Terminal ini menggunakan Python dan tanggal publikasi sintetis.
Tugas di sini spesifik: memundurkan stempel waktu publikasi sebanyak bilangan bulat jam nonnegatif, sambil mempertahankan UTC untuk nilai masukan dan keluaran. Contohnya, mengurangi tujuh jam dari 2026-05-12T02:30:00Z menghasilkan 2026-05-11T19:30:00Z.
“Dengan tepat” mengikuti model datetime Python yang terdokumentasi: satu jam adalah 3.600 detik, dan detik kabisat tidak direpresentasikan. Karena itu, alur kerja ini sesuai untuk stempel waktu publikasi biasa; perhitungan yang harus menghitung detik kabisat memerlukan model waktu yang berbeda. Dokumentasi datetime Python
Jenis tanggal apa yang Anda gunakan sebagai masukan?
Sebelum menghitung, bedakan tanggal kalender dari stempel waktu. Tanggal seperti 2026-05-12 tidak memberi tahu kapan publikasi berlangsung. Menambahkan tengah malam atau mengasumsikan zona lokal Mac Anda akan memasukkan informasi yang tidak diberikan oleh masukan.
| Konsep | Contoh sintetis | Informasi yang diberikan |
|---|---|---|
| Tanggal sipil | 2026-05-12 |
Hari kalender tanpa waktu atau offset |
| Tanggal dan waktu lokal | 2026-05-12T02:30:00 |
Nilai jam tanpa konteks yang cukup untuk menentukan suatu saat tertentu |
| Saat yang dinyatakan dalam UTC | 2026-05-12T02:30:00Z |
Titik waktu tertentu |
| Offset numerik | +00:00 |
Selisih terhadap UTC yang dinyatakan |
| Zona waktu bernama | Europe/Paris |
Aturan untuk menghubungkan pembacaan jam lokal dengan UTC |
Offset dan zona bernama memiliki fungsi yang berbeda. Offset numerik menjelaskan hubungan stempel waktu dengan UTC; zona bernama menyediakan aturan yang dapat berubah sesuai tanggal. RFC 9557 mendefinisikan perbedaan ini dan menjelaskan mengapa beberapa pembacaan jam lokal dapat sesuai dengan nol atau beberapa saat tertentu. RFC 9557, definisi
Untuk tugas ini, gunakan stempel waktu lengkap. Program di bawah menerima T huruf besar, detik, pecahan detik opsional sebanyak satu hingga enam digit, dan Z atau +00:00. Ini adalah subset RFC 3339 yang sengaja dibatasi; tata bahasa stempel waktunya juga mengizinkan offset lain dan lebih banyak digit pecahan. RFC 3339, format tanggal/waktu
Bagaimana cara mengurangi jam di Terminal?
Siapkan Python di Mac
Buka Finder, buka /Applications/Utilities, lalu klik dua kali Terminal. Apple mendokumentasikan cara ini untuk membuka aplikasi baris perintah. Membuka atau menutup Terminal di Mac
Masukkan perintah ini lalu tekan Return:
python3 --version
Gunakan Python 3.11 atau versi yang lebih baru untuk panduan ini. Jika interpreter yang sesuai tidak tersedia, ikuti petunjuk instalasi resmi untuk macOS: dapatkan penginstal Python yang didukung dari halaman unduhan macOS yang ditautkan, buka file .pkg, lalu selesaikan langkah instalasi yang didokumentasikan. Kemudian buka jendela Terminal baru dan periksa versinya lagi. Dokumentasi Python menjelaskan instalasi dan cara menjalankan Python dari shell. Menggunakan Python di macOS
Jalankan seluruh perhitungan
Salin seluruh blok di bawah ke Terminal, termasuk baris pertama dan terakhir, lalu tekan Return. Untuk perhitungan lain, ubah hanya source_timestamp dan hours_to_subtract sebelum menempelkan kode. Pertahankan tanda kutip pada stempel waktu dan masukkan jumlah jam sebagai bilangan bulat.
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
Keluaran untuk stempel waktu publikasi sintetis yang diberikan adalah:
2026-05-11T19:30:00Z
Ini adalah program lengkap yang menggunakan pustaka standar Python. Program mencetak stempel waktu hasil perhitungan tanpa membuat file. Salin hasilnya ke kolom tanggal publikasi atau dokumen yang sedang Anda siapkan.
Urutan API-nya adalah datetime.fromisoformat(), konversi ke timezone.utc, pengurangan timedelta(hours=hours), lalu keluaran melalui isoformat(). Python mendokumentasikan operasi parsing, zona waktu, durasi, dan pemformatan ini. API datetime Python
Bagaimana program mempertahankan UTC dan pecahan detik?
Pemeriksaan masukan mewajibkan representasi UTC yang eksplisit. Stempel waktu tanpa offset langsung ditolak, jadi program tidak perlu menyimpulkan zona waktu dari pengaturan Mac Anda. Kedua sufiks yang diterima diparsing sebagai stempel waktu dengan offset nol, dan keluaran selalu ditulis dengan Z.
Mempertahankan UTC bukan berarti mempertahankan setiap karakter dari string asli. Masukan yang diakhiri dengan +00:00 akan menghasilkan keluaran yang diakhiri dengan Z. Hasilnya tetap direpresentasikan dalam UTC, sementara tanggal dan waktunya dimundurkan sesuai durasi yang diminta.
Program ini juga mempertahankan teks pecahan detik yang diberikan. Mengurangi jam bulat tidak mengubah pecahan tersebut, jadi .120 tetap menjadi .120, alih-alih berubah menjadi .12 atau dihilangkan. Masukan dengan lebih dari enam digit pecahan ditolak, bukan dipersingkat.
Ada nuansa standar yang perlu diperhatikan: Z menyatakan offset UTC nol, tetapi tidak menetapkan zona waktu lokasi asal. RFC 9557 memperbarui interpretasi Z dalam RFC 3339 sehingga offset lokal dapat dinyatakan tidak diketahui. Program ini sengaja menerima Z dan +00:00; program menolak -00:00 sebagai pilihan kebijakan masukan. RFC 9557, pembaruan terhadap RFC 3339
Bagaimana cara memeriksa hasil sebelum menggunakannya?
Mulailah dengan perhitungan yang melewati tengah malam. Pada contoh utama, memundurkan waktu dua jam menghasilkan 00:30:00 pada 12 Mei; memundurkan lima jam lagi menghasilkan 19:30:00 pada 11 Mei. Hasil yang tetap bertanggal 12 Mei akan keliru.
Contoh sintetis berikut memberikan pemeriksaan tambahan. Ubah dua nilai masukan dalam program lengkap untuk menghasilkan kembali setiap baris.
| Masukan UTC | Jam yang dikurangi | Keluaran UTC yang diharapkan |
|---|---|---|
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 |
Untuk contoh utama, intervalnya adalah tujuh kali 3.600, atau 25.200 detik. Menit dan detik tetap sama karena durasi yang diminta hanya berisi jam bulat. Tanggalnya dapat berubah melewati tengah malam, pergantian bulan, atau pergantian tahun.
Apa yang harus dilakukan jika masukan ditolak?
Gunakan penolakan itu sebagai langkah diagnostik. Cari informasi yang belum ada atau atasi presisi yang tidak didukung sebelum mencoba lagi.
- Hanya tanggal yang tersedia: Dapatkan waktu publikasi yang dimaksud beserta offset-nya. Tanggal sipil saja tidak dapat menentukan saat awal.
- Stempel waktu tidak memiliki offset: Pastikan apakah nilainya menyatakan UTC atau waktu lokal sebelum menambahkan sufiks.
- Stempel waktu memiliki offset bukan nol: Konversikan saat yang dinyatakan ke UTC terlebih dahulu. Mengubah sufiks saja akan mengubah maknanya.
- Ada lebih dari enam digit pecahan: Gunakan alat yang mempertahankan presisi tersebut, atau tetapkan kebijakan pembulatan secara eksplisit sebelum menggunakan alur kerja ini.
- Jamnya negatif atau pecahan: Masukkan bilangan bulat nonnegatif. Program ini sengaja hanya menerapkan pengurangan jam bulat.
- Kolom kalender tidak valid: Perbaiki nilai sumber. Tanggal yang tidak mungkin, seperti 30 Februari, akan ditolak.
Python mendukung tahun datetime dari 1 sampai 9999; pengurangan yang keluar dari rentang itu akan gagal. Model datetime-nya juga menolak nilai detik 60, meskipun RFC 3339 mengizinkan nilai tersebut untuk detik kabisat dalam kondisi tertentu. Batasan datetime Python, RFC 3339, batasan
Jika kebutuhan Anda sebenarnya adalah “jam lokal yang sama pada hari sebelumnya”, gunakan alur kerja kalender dengan zona bernama. Offset zona bernama dapat berubah saat transisi waktu musim panas, jadi tugas itu dapat berbeda dari pengurangan 24 jam yang telah berlalu. Dokumentasi zoneinfo Python menunjukkan perhitungan aritmetika selama transisi semacam itu. Dukungan zona waktu IANA di Python
Untuk stempel waktu publikasi yang sudah dinyatakan dalam UTC, fokuskan operasi: validasi masukan, kurangi durasi jam bulat, lalu pertahankan sufiks UTC yang eksplisit pada nilai yang Anda salin. Periksa perubahan tanggal dan presisi pecahan sebelum menggunakan hasilnya.
Sumber
- datetime — Tipe tanggal dan waktu dasar — Python Software Foundation.
- Menggunakan Python di macOS — Python Software Foundation.
- Membuka atau menutup Terminal di Mac — Apple.
- RFC 3339: Tanggal dan Waktu di Internet: Stempel Waktu — RFC Editor.
- RFC 9557: Tanggal dan Waktu di Internet: Stempel Waktu dengan Informasi Tambahan — RFC Editor.
- zoneinfo — Dukungan zona waktu IANA — Python Software Foundation.