นี่เป็นปัญหาที่สำคัญและยากอย่างน่าประหลาดใจ ความจริงก็คือว่าไม่มีมาตรฐานที่น่าพอใจอย่างสมบูรณ์สำหรับเวลาที่คงอยู่ ตัวอย่างเช่นมาตรฐาน SQL และรูปแบบ ISO (ISO 8601) ไม่ชัดเจนเพียงพอ
จากมุมมองแนวคิดหนึ่งมักเกี่ยวข้องกับข้อมูลวันที่สองประเภทและสะดวกในการแยกความแตกต่าง (มาตรฐานด้านบนไม่ได้): " เวลาทางกายภาพ " และ " เวลาทางแพ่ง "
ทันเวลา "กายภาพ" เป็นจุดหนึ่งในช่วงเวลาสากลต่อเนื่องที่ฟิสิกส์จัดการกับ (ไม่คำนึงถึงความสัมพันธ์, แน่นอน) แนวคิดนี้สามารถเข้ารหัสอย่างเพียงพอใน UTC เช่น (ถ้าคุณสามารถข้ามวินาทีเผ่น)
เวลา "แพ่ง" เป็นข้อมูลจำเพาะของวันที่และเวลาซึ่งปฏิบัติตามบรรทัดฐานทางแพ่ง: เวลาที่นี่ถูกระบุอย่างสมบูรณ์โดยชุดของเขตข้อมูลวันที่ (Y, M, D, H, MM, S, FS) และ TZ (ข้อกำหนดเขตเวลา) (เช่นกัน "ปฏิทิน" จริง ๆ แล้ว แต่ให้ถือว่าเรา จำกัด การสนทนากับปฏิทินเกรโกเรียนเท่านั้น) เขตเวลาและปฏิทินร่วมกันอนุญาตให้ (ในหลักการ) แผนที่จากตัวแทนหนึ่งไปยังอีก แต่ช่วงเวลาทางแพ่งและทางกายภาพนั้นเป็นประเภทที่แตกต่างกันโดยพื้นฐานและพวกเขาควรจะแยกแนวคิดและการรักษาที่แตกต่างกัน (การเปรียบเทียบ: อาร์เรย์ของไบต์และสายอักขระ)
ปัญหานี้ทำให้เกิดความสับสนเพราะเราพูดถึงเหตุการณ์ประเภทนี้สลับกันได้และเนื่องจากเวลาทางแพ่งนั้นอาจมีการเปลี่ยนแปลงทางการเมือง ปัญหา (และความต้องการที่จะแยกแยะแนวคิดเหล่านี้) จะชัดเจนมากขึ้นสำหรับเหตุการณ์ในอนาคต ตัวอย่าง (เอามาจากการสนทนาของฉันที่นี่
จอห์นบันทึกในปฏิทินของเขาเตือนสำหรับเหตุการณ์บางอย่างที่ datetime
2019-Jul-27, 10:30:00
, TZ = Chile/Santiago
, (ซึ่งได้ชดเชย GMT-4 ดังนั้นจึงสอดคล้องกับ UTC 2019-Jul-27 14:30:00
) แต่บางวันในอนาคตประเทศตัดสินใจเปลี่ยน TZ offset เป็น GMT-5
ตอนนี้เมื่อวันที่มาถึง ... ควรเตือนความทรงจำที่
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
หรือ
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
ไม่มีคำตอบที่ถูกต้องเว้นแต่ว่าใครจะรู้ว่าจอห์นหมายถึงความหมายเมื่อเขาบอกปฏิทิน "โปรดโทรหาฉันที่2019-Jul-27, 10:30:00
TZ=Chile/Santiago
"
เขาหมายถึง "วันเวลาพลเรือน" ("เมื่อนาฬิกาในเมืองของฉันบอกเวลา 10:30 น.") หรือไม่ ในกรณีนั้น A) เป็นคำตอบที่ถูกต้อง
หรือเขาหมายถึง "ร่างกายทันใจทันเวลา" ซึ่งเป็นจุดในช่วงเวลาต่อเนื่องของเอกภพของเราพูดว่า "เมื่อสุริยุปราคาต่อไปเกิดขึ้น" ในกรณีนั้นคำตอบ B) นั้นถูกต้อง
API วันที่ / เวลาไม่กี่ครั้งจะได้รับการแยกความแตกต่างนี้: Jodatimeซึ่งเป็นรากฐานของ Java DateTime API ถัดไป (ที่สาม!) (JSR 310)
GETDATE()
บน SQL จะเป็น UTC ( ตามใจชอบDateTime.Now
) และเซิร์ฟเวอร์จะไม่ได้รับผลกระทบจากการเปลี่ยนแปลง DST อัตโนมัติใด ๆ