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!
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.
Semasa anda memikirkan masalah itu, anda menyedari terdapat kaedah untuk mengatasi kekaburan masa yang diberikan kepada anda:
Sumber anda mungkin memberikan lokasi yang menunjukkan waktu tempatan adalah 3:14 PM. Contohnya, Los Angeles, Bahamas atau London.
Sumber anda mungkin menggunakan piawaian seperti UTC (Waktu Sejagat Selaras) untuk memberikan anda offset dari lokasi yang dipersetujui (seperti Greenwich, London).
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.
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.
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.
Walaupun pemudahan ini berlaku untuk banyak lokasi, malangnya terdapat banyak pengecualian untuk peraturan ini.
Rujukan: Zon waktu dunia (Wikipedia)
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.
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]].
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.
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.
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.
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:
Jadi, sekarang kita tahu tentang:
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.
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
$NOW(tzmins)
$HOROLOG
$ZTIMEZONE
$ZDATETIME() / $ZDT()
$ZDATETIMEH() / $ZDTH()
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.
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"
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"
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")
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!
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!