Rumah > pembangunan bahagian belakang > Tutorial Python > Zon Masa dan Offset dan ObjectScript, Oh My!

Zon Masa dan Offset dan ObjectScript, Oh My!

Patricia Arquette
Lepaskan: 2025-01-01 13:06:13
asal
785 orang telah melayarinya

Misi anda

Mari kita berpura-pura sejenak bahawa anda seorang pengintip tindakan antarabangsa yang mengabdikan hidup anda untuk memastikan penduduk dunia selamat daripada bahaya. Anda menerima misi berikut:

Selamat hari, Ejen IRIS,

Kami memohon maaf kerana mengganggu percutian anda di Bahamas, tetapi kami baru sahaja menerima berita daripada ejen London kami bahawa "bom jangka" akan meletup di kawasan berpenduduk tinggi di Los Angeles. Sumber kami mengatakan bahawa "bom jangka" ditetapkan untuk dicetuskan pada pukul 3:14 petang ini.

Cepat, orang ramai mengharapkan anda!

Masalahnya

Anda bergegas berdiri dan bersiap sedia untuk menuju ke Los Angeles, tetapi anda dengan cepat menyedari bahawa anda kehilangan maklumat penting; adakah "bom jangka" akan dicetuskan pada 3:14 PM waktu Bahama atau pada 3:14 PM waktu Los Angeles? ...atau mungkin 3:14 PM waktu London.

Anda dengan cepat menyedari bahawa masa yang diberikan kepada anda (3:14 PM) tidak memberi anda maklumat yang mencukupi untuk menentukan bila anda perlu berada di Los Angeles.

Masa yang diberikan kepada anda (3:14 PM) adalah kabur. Anda memerlukan lebih banyak maklumat untuk menentukan masa tepat.

Beberapa Penyelesaian

Semasa anda memikirkan masalah itu, anda menyedari terdapat kaedah untuk mengatasi kekaburan masa yang diberikan kepada anda:

  1. Sumber anda mungkin memberikan lokasi yang menunjukkan waktu tempatan adalah 3:14 PM. Contohnya, Los Angeles, Bahamas atau London.

  2. Sumber anda mungkin menggunakan piawaian seperti UTC (Waktu Sejagat Selaras) untuk memberikan anda offset dari lokasi yang dipersetujui (seperti Greenwich, London).

Pengakhiran yang Bahagia

Anda menghubungi sumber anda dan mengesahkan bahawa masa yang diberikan sememangnya 3:14 PM waktu Los Angeles. Anda boleh pergi ke Los Angeles, melucutkan senjata "bom jangka" sebelum 3:14 PM dan kembali ke Bahamas dengan cepat untuk menamatkan percutian anda.

Titik

Jadi, apa gunanya latihan berfikir ini? Saya ragu bahawa mana-mana daripada kita akan menghadapi masalah yang dibentangkan di atas, tetapi jika anda bekerja dengan aplikasi atau kod yang memindahkan data dari satu lokasi ke lokasi lain (terutamanya jika lokasi berada dalam zon waktu yang berbeza), anda perlu sedar cara mengendalikan masa tarikh dan zon masa.

Zon Masa adalah SUKAR!

Nah, zon waktu tidak begitu teruk. Waktu penjimatan siang dan sempadan politik menyukarkan zon waktu.

Saya fikir saya sentiasa memahami idea "umum" zon waktu: planet ini terbahagi kepada kepingan menegak mengikut zon waktu, di mana setiap zon waktu adalah satu jam di belakang zon waktu ke Timur.

Time Zones and Offsets and ObjectScript, Oh My!

Walaupun pemudahan ini berlaku untuk banyak lokasi, malangnya terdapat banyak pengecualian untuk peraturan ini.

Time Zones and Offsets and ObjectScript, Oh My!
Rujukan: Zon waktu dunia (Wikipedia)

Penyeragaman dengan UTC ("Asal")

Untuk memudahkan bahasa menyampaikan masa tertentu, dunia telah menetapkan penggunaan UTC (Waktu Sejagat Selaras). Piawaian ini menetapkan "asal" kepada longitud 0° yang melalui Greenwich, London.

Mentakrifkan "Offset"

Menggunakan UTC sebagai asas, semua zon waktu lain boleh ditakrifkan secara relatif kepada UTC. Hubungan ini dirujuk sebagai offset UTC.

Jika anda mempunyai waktu tempatan dan offset, anda tidak lagi mempunyai masa yang samar-samar (seperti yang dilihat dalam contoh pengintip kami di atas); anda mempunyai masa yang pasti dan khusus tanpa kesamaran.

Format biasa yang digunakan untuk menunjukkan offset UTC ialah ±HHMM[SS[.ffffff]].

  • Tanda tolak - menunjukkan offset ke Barat UTC.
  • Tanda tambah menunjukkan offset ke Timur UTC.
  • HH menunjukkan jam (berlapik sifar)
  • MM menunjukkan minit (berlapik sifar)
  • SS menunjukkan saat (berlapik sifar)
  • .ffffff menunjukkan saat pecahan

Sebagai contoh, di Amerika, Zon Zime Standard Timur (EST) ditakrifkan sebagai -0500 UTC. Ini bermakna semua lokasi di EST adalah 5 jam di belakang UTC. Jika masa ialah 9:00 PM di UTC, maka waktu tempatan di EST ialah 4:00 PM.

Di Australian Central Western Standard Time Zone (ACWST), offset ditakrifkan sebagai 0845 UTC. Jika masa ialah 1:00 PG di UTC, maka waktu tempatan di ACWST ialah 9:45 PG.

Waktu Penjimatan Siang

Jadi, kembali kepada peta zon waktu di atas. Daripada imej, anda dapat melihat bahawa banyak zon waktu mengikut sempadan politik negara dan wilayah. Ini merumitkan sedikit pengiraan zon waktu, tetapi ia cukup mudah untuk menyelubungi fikiran anda.

Malangnya, terdapat satu lagi faktor yang perlu dipertimbangkan apabila bekerja dengan masa dan zon waktu.

Jom tengok Los Angeles.

Pada peta, ofset UTC untuk Los Angeles ialah -8 dalam Masa Standard. Waktu Standard biasanya diikuti semasa bulan-bulan musim sejuk, manakala Waktu Penjimatan Siang lazimnya diikuti semasa bulan-bulan musim panas.

Waktu Penjimatan Siang (DST) memajukan jam dalam zon waktu memberi ke hadapan (biasanya satu jam pada bulan-bulan musim panas). Terdapat beberapa sebab kawasan politik mungkin memilih untuk mengikuti DST (seperti penjimatan tenaga, penggunaan siang yang lebih baik, dsb.). Kesukaran dan kerumitan Waktu Penjimatan Siang ialah DST tidak diikuti secara konsisten di seluruh dunia. Bergantung pada lokasi anda, wilayah anda mungkin mengikuti DST atau tidak.

Pangkalan Data Zon Waktu

Memandangkan gabungan sempadan politik dan Waktu Jimat Siang meningkatkan kerumitan menentukan masa tertentu, pangkalan data zon waktu diperlukan untuk memetakan waktu tempatan dengan betul kepada masa tertentu berbanding UTC. Pangkalan Data Zon Waktu Internet Assigned Numbers Authority (IANA) ialah sumber biasa maklumat zon waktu yang digunakan oleh sistem pengendalian dan bahasa pengaturcaraan.

Pangkalan data termasuk nama dan alias semua zon waktu, maklumat tentang offset, maklumat tentang penggunaan Waktu Penjimatan Siang, singkatan zon waktu dan julat tarikh yang pelbagai peraturan dikenakan.

Salinan dan maklumat tentang pangkalan data zon waktu boleh didapati di tapak web IANA.

Kebanyakan sistem UNIX mempunyai salinan pangkalan data yang dikemas kini dengan pengurus pakej sistem pengendalian (biasanya dipasang dalam /usr/share/zoneinfo). Sesetengah bahasa pengaturcaraan mempunyai pangkalan data terbina dalam. Orang lain menyediakannya oleh perpustakaan atau boleh membaca salinan pangkalan data sistem.

Nama/Pengecam Zon Masa

Pangkalan data zon waktu mengandungi banyak nama dan alias untuk zon waktu tertentu. Kebanyakan penyertaan termasuk negara (atau benua) dan bandar utama dalam nama. Contohnya:

  • Amerika/New_York
  • Amerika/Los_Angeles
  • Eropah/Rom
  • Australia/Melbourne

Penukaran dan Pemformatan Menggunakan ObjectScript

Jadi, sekarang kita tahu tentang:

  • Masa tempatan (masa samar-samar tanpa offset atau lokasi)
  • Mengimbangi UTC (mengimbangi relatif cap waktu atau lokasi adalah daripada "asal" UTC di Greenwich, London)
  • Waktu Penjimatan Siang (percubaan untuk membantu tamadun dengan mengorbankan pengimbangan zon waktu)
  • Pangkalan data zon waktu (yang termasuk maklumat tentang zon waktu dan pematuhan Penjimatan Siang di banyak lokasi dan wilayah)

Mengetahui perkara ini, bagaimana kita boleh bekerja dengan tarikh masa/zon masa dalam ObjectScript?

***Nota: Saya percaya semua pernyataan berikut adalah benar tentang ObjectScript, tetapi sila beritahu saya jika saya salah nyatakan cara ObjectScript berfungsi dengan zon waktu dan offset.

Pembolehubah dan Fungsi Terbina dalam

Jika anda perlu menukar cap masa antara pelbagai format dalam zon waktu sistem proses yang menjalankan IRIS, ciri terbina dalam ObjectScript sepatutnya mencukupi. Berikut ialah senarai ringkas pelbagai pembolehubah/fungsi berkaitan masa dalam ObjectScript:

  • $ZTIMESTAMP / $ZTS

    • Format dalaman IRIS sebagai nilai UTC (offset 0000).
    • Format: ddddd,sssss.fffffff
  • $NOW(tzmins)

    • Waktu tempatan sistem semasa dengan tzmin yang diberikan diimbangi daripada UTC.
    • Tidak mengambil kira Waktu Penjimatan Siang.
    • Secara lalai, tzmins adalah berdasarkan pembolehubah $ZTIMEZONE.
    • Format: ddddd,sssss.fffffff
  • $HOROLOG

    • Waktu tempatan sistem semasa (berdasarkan $ZTIMEZONE), mengambil kira Waktu Penjimatan Siang.
    • Format: ddddd,sssss.fffffff
  • $ZTIMEZONE

    • Mengembalikan atau menetapkan offset UTC tempatan sistem dalam beberapa minit.
  • $ZDATETIME() / $ZDT()

    • Menukar format $HOROLOG kepada format paparan tertentu.
    • Boleh digunakan untuk menukar daripada waktu tempatan sistem kepada UTC ( 0000).
  • $ZDATETIMEH() / $ZDTH()

    • Menukar rentetan datetime kepada format $HOROLOG dalaman.
    • Boleh digunakan untuk menukar daripada UTC ( 0000) kepada sistem waktu tempatan.

Sebaik yang saya tahu, fungsi ini hanya dapat memanipulasi masa tarikh menggunakan zon masa sistem tempatan. Nampaknya tidak ada cara untuk bekerja dengan zon waktu sewenang-wenang dalam ObjectScript.

Masukkan Pustaka tz pada Open Exchange

Untuk menampung penukaran ke dan dari zon waktu sewenang-wenangnya, saya berusaha untuk mencipta tz - Pustaka Penukaran Zon Masa ObjectScript.

Pustaka ini mengakses pangkalan data zon waktu yang dipasang pada sistem anda untuk menyediakan sokongan untuk menukar cap masa antara zon waktu dan format.

Sebagai contoh, jika anda mempunyai masa setempat ke Los Angeles (America/Los_Angeles), anda boleh menukarnya kepada zon waktu yang digunakan di Bahamas (Amerika/New_York) atau zon waktu yang digunakan di London (Eropah/London):

USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "America/New_York")
"2024-12-20 06:14 PM"

USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "Europe/London")
"2024-12-20 11:14 PM"
Salin selepas log masuk

Jika anda diberi cap masa dengan ofset, anda boleh menukarnya kepada waktu tempatan di Eucla, Australia (Australia/Eucla), walaupun anda tidak tahu zon waktu asal:

USER>zw ##class(tz.Ens).TZ("2024-12-20 08:00 PM -0500", "Australia/Eucla")
"2024-12-21 09:45 AM +0845"
Salin selepas log masuk

Jika anda menggunakan mesej HL7, pustaka tz mempunyai beberapa kaedah yang terdedah kepada Peraturan Kebolehoperasian dan DTL untuk membantu anda menukar dengan mudah antara zon waktu, waktu tempatan, masa dengan offset, dsb.:

// Convert local time from one time zone to another      
set datetime = "20240102033045"
set newDatetime = ##class(tz.Ens).TZ(datetime,"America/New_York","America/Chicago")

// Convert local time to offset      
set datetime = "20240102033045"
set newDatetime = ##class(tz.Ens).TZOffset(datetime,"America/Chicago","America/New_York")

// Convert offset to local time      
set datetime = "20240102033045-0500"
set newDatetime = ##class(tz.Ens).TZLocal(datetime,"America/Chicago")

// Convert to a non-HL7 format   
set datetime = "20240102033045-0500"
set newDatetime = ##class(tz.Ens).TZ(datetime,"America/Chicago",,"%m/%d/%Y %H:%M:%S %z")
Salin selepas log masuk

Ringkasan

Saya menghargai anda mengikuti saya dalam "perjalanan antarabangsa" ini di mana kami menemui zon waktu, Waktu Penjimatan Siang, peta dunia dan "bom jangka". Mudah-mudahan, ini dapat menjelaskan (dan memudahkan) banyak kerumitan bekerja dengan masa tarikh dan zon waktu.

Lihat tz - Pustaka Penukaran Zon Masa ObjectScript dan beritahu saya jika anda mempunyai sebarang soalan (atau pembetulan/penjelasan kepada sesuatu yang saya katakan).

Terima kasih!

Rujukan/Pautan Menarik

  • https://ms.wikipedia.org/wiki/Coordinated_Universal_Time
  • https://ms.wikipedia.org/wiki/Zon_Masa
  • https://ms.wikipedia.org/wiki/Daylight_saving_time
  • https://www.worldtimeserver.com/learn/unusual-time-zones/
  • https://www.worldtimeserver.com/learn/history-of-time-zones/
  • https://www.worldtimeserver.com/learn/what-is-a-time-zone/
  • https://ms.wikipedia.org/wiki/Tz_database
  • https://ms.wikipedia.org/wiki/List_of_tz_database_time_zones
  • https://ms.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority
  • https://www.iana.org/time-zones
  • https://www.gnu.org/software/libc/manual/html_node/Calendar-Time.html

Atas ialah kandungan terperinci Zon Masa dan Offset dan ObjectScript, Oh My!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan