เหตุใดเขตเวลาจึงมีออฟเซ็ตออฟจาก UTC ในปี 0001 ใน Postgres อย่างบ้าคลั่ง


16

ใน Postgres 9.5 ฉันรู้สึกประหลาดใจเมื่อเห็นผลลัพธ์ที่เห็นด้านล่างขณะทำการทดสอบกับปี0001(ไม่มีศูนย์ปี0000)

ออฟเซ็ตของ-07:52:58?

ตัวอย่างรหัสบางส่วน โปรดทราบว่าฉันใช้ผสมกับTIMESTAMP WITH TIME ZONEและTIMESTAMP WITHOUT TIME ZONEดังนั้นอ่านอย่างระมัดระวัง

SET TIME ZONE 'America/Los_Angeles' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', 
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;

("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")

0001-12-31 16:07:02-07:52:58 BCฉันกำลังประหลาดใจโดยค่าที่สองว่า ผมเข้าใจว่าเราต้องย้อนกลับไปแปดชั่วโมงเป็นAmerica/Los_Angelesเป็นแปดชั่วโมงที่อยู่เบื้องหลัง UTC กับ offset -08:00ของ แต่แทนที่จะมีชดเชย-08:00 -07:52:58ทำไม?

ไม่มีปัญหาภายใต้ UTC

ไม่มีปัญหาดังกล่าวเมื่อป้อนข้อมูลภายใต้ UTC

SET TIME ZONE 'UTC' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',  
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');

("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")

ไม่มีศูนย์ปี

โดยส่วนวันที่ดูเหมือนจะถูกต้อง ดูเหมือนว่าไม่มีปี0000ที่เป็นจุดหมุนระหว่างยุค“ BC” และ“ AD” ใช้เวลาช่วงแรกของปี 0001 ลบหนึ่งชั่วโมงและคุณจะได้ปี0001 BC- ดังนั้นจึงไม่มีปีศูนย์

SET TIME ZONE 'UTC' ;

INSERT INTO moment_  -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;

SET TIME ZONE 'UTC' ;

TABLE moment_ ;

ผลที่ได้คือปี0001 BCดังนั้นเราจึงกระโดดจาก0001ไป0001 BC; 0000ไม่มีปีศูนย์

"0001-12-31 23:00:00+00 BC"

นอกจากนี้วิดีโอที่ดีเกี่ยวกับความบ้าของเขตเวลา
billinkc

จุดหมุนระหว่าง BC และ AD คือปี 1 ทั้งปี 1 หรือปี -1 มันเป็นเพียงแค่วิธีการตั้งชื่อปี ไม่มีปี 0 (หรือมากกว่านั้นไม่ได้ถูกกำหนดเนื่องจากเป็นปัญหาด้านความหมายมากกว่ามีอยู่)
slebetman

ย้อนกลับไปในช่วงเฉลิมฉลองปี 2000 เมื่อคนอวดรู้บางคนกล่าวว่าการเริ่มต้นสหัสวรรษที่สองในปี 2544 ไม่ใช่ปี 2000? นั่นเป็นเหตุผล ปีเริ่มต้นที่ 1 ไม่ใช่ 0 และปีก่อนปีที่ 1 คือปี 1 ปีก่อนคริสต์ศักราช (เช่นปีที่ 1)
slebetman

1
@slebetman ที่ขึ้นอยู่กับปฏิทินที่ใช้งาน Gregorian แบบ Proleptic มีทั้งแบบฟอร์มที่ใช้ 0 เป็นปีก่อน 1 CE และแบบฟอร์มที่วาง 1 BCE ทันทีก่อน 1 CE (ISO 8601 สนับสนุนทั้งในการ0000เป็นค่าปีที่ถูกต้อง แต่ไม่ยืนยันว่าจะใช้หรือไม่ ) เป็นความจริงที่ PostgreSQL ใช้แบบฟอร์มที่ไม่มีปี 0 แต่คุณไม่สามารถระบุ "ปีที่เริ่มต้น 1 ไม่ใช่ 0" ราวกับว่ามันเป็นข้อเท็จจริงสากล มันง่ายต่อการแปลระหว่างพวกเขาเช่นข้อมูลทางดาราศาสตร์ (สหัสวรรษที่สามยังคงเริ่มต้นในปี 2001 ด้วยวิธีใดวิธีหนึ่งเนื่องจากยังคงเป็นสหัสวรรษที่สามนับตั้งแต่ 1 CE)
Jon Hanna

@ จอนฮันนา: ไม่มีใครใช้ปฏิทินเกรโกเรียนแบบ proleptic ใด ๆในขณะนี้ดังนั้นฉันคิดว่ามันยุติธรรมที่จะได้รับสิทธิพิเศษในปฏิทินจูเลียนที่นี่ - ซึ่งไม่มีศูนย์ปี
Kevin

คำตอบ:


22

เมื่อวันที่ 18 พฤศจิกายน 1883 เวลา 12:00 น. (เวลาใหม่) เวลามาตรฐานถูกนำมาใช้โดยรถไฟอเมริกัน

ซึ่งหมายความว่าก่อนเวลานั้นลอสแองเจลิสใช้เวลาท้องถิ่นตามจริงตามเวลาสุริยะ หลังจากนั้นมันก็ถูกย้ายไปยังเขตเวลาท้องถิ่นซึ่งเป็นการชดเชยหนึ่งชั่วโมงจากเวลามาตรฐานกรีนิชแตกต่างจากครั้งก่อนเล็กน้อย

ต้องการทราบข้อมูลเพิ่มเติมหรือไม่

  • ดาวน์โหลด tzdata ฐานข้อมูลเขตเวลาจากIANA: โซนเวลา

  • ภายในคุณจะพบคำจำกัดความของเขตเวลา (จำนวนมาก) ซึ่งมีรูปแบบที่หลากหลายตลอดเวลาพร้อมด้วยความคิดเห็นมากมายที่แสดงรายละเอียดว่ามีการเปลี่ยนแปลงที่เกิดขึ้นและเมื่อใด มันสนุกกับการอ่าน!

  • Wikipedia มีข้อเท็จจริงที่น่าสนใจบางส่วนในหน้าWikipedia: Time Zoneเกี่ยวกับการเปลี่ยนแปลงในปี 1883 18 พฤศจิกายน:

เวลารถไฟ
... การ
บอกเวลาบนรางรถไฟอเมริกันในช่วงกลางศตวรรษที่ 19 ค่อนข้างสับสน ทางรถไฟแต่ละแห่งใช้เวลามาตรฐานของตนเองโดยปกติจะขึ้นอยู่กับเวลาท้องถิ่นของสำนักงานใหญ่หรือจุดประสงค์ที่สำคัญที่สุดและตารางรถไฟของรถไฟได้รับการตีพิมพ์โดยใช้เวลาของตนเอง ทางแยกบางแห่งเสิร์ฟโดยทางรถไฟหลายแห่งมีนาฬิกาสำหรับรถไฟแต่ละแห่ง
... ระบบของ Dowd ไม่เคยได้รับการยอมรับจากทางรถไฟอเมริกา แทนสหรัฐอเมริกาและแคนาดาดำเนินการทางรถไฟรุ่นที่เสนอโดย William F. Allen บรรณาธิการของคู่มือการเดินทางอย่างเป็นทางการของทางรถไฟ ชายแดนของเขตเวลาวิ่งผ่านสถานีรถไฟบ่อยครั้งในเมืองใหญ่ ๆ ตัวอย่างเช่นชายแดนระหว่างเขตเวลาตะวันออกและโซนกลางไหลผ่านดีทรอยต์บัฟฟาโลพิตต์สเบิร์กแอตแลนตาและชาร์ลสตัน มันเปิดตัวในวันอาทิตย์ที่18 พฤศจิกายน 2426เรียกอีกอย่างว่า"วันแห่งสองเที่ยง"เมื่อแต่ละสถานีรถไฟสถานีนาฬิกาตั้งเวลาเที่ยง - เวลามาตรฐานก็มาถึงในแต่ละโซนเวลา โซนนี้มีชื่อว่า Intercolonial, Eastern, Central, Mountain และ Pacific ...

นอกจากนี้โปรดทราบว่านี่ไม่เฉพาะ Postgresql สิ่งนี้ใช้ได้สำหรับซอฟต์แวร์หรือระบบปฏิบัติการใด ๆ ที่ใช้ฐานข้อมูล tzdata (แน่นอนว่าหลายคนจะถูก จำกัด วันที่อย่างใดอย่างหนึ่งหลังปี 1970 หรือปี 1901 ดังนั้น 1883 อยู่ไกลเกินเอื้อม แต่มีการปรับอื่น ๆ อีกมากมายทั่วสถานที่ เวลาที่ต่างกัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.