วันที่ - ปีก่อนปี 1901 ถือว่าไม่ถูกต้อง


11

ฉันมีวันที่ (GNU coreutils) 7.1 ติดตั้งบนระบบของฉัน

หากฉันพยายามตรวจสอบวันที่ก่อนวันที่ 14 ธันวาคม 1901 ฉันได้รับข้อผิดพลาด "วันที่ไม่ถูกต้อง" ตัวอย่างเช่น,

  $ date -d 1901-12-13
  date: invalid date `1901-12-13'

  $ date -d 1901-12-14
  Sat Dec 14 00:00:00 EST 1901

ฉันควรทำอย่างไรเพื่อให้dateยูทิลิตี้ในการรักษาหลายปีก่อนปี 1901 ว่าถูกต้อง?

ฉันได้รับข้อผิดพลาดที่คล้ายกันสำหรับวันที่หลังจาก 19 ม.ค. 2038


ฉันไม่ได้รับข้อผิดพลาด ฉันใช้ coreutils 8.10 อาจเป็นข้อผิดพลาดเก่าหรือไม่
xenoterracide

@xenoterracide คุณเป็นระบบ 64 บิตหรือไม่
Mikel

@ Mikel ใช่ฉัน
xenoterracide

คำตอบ:


15

คำถามที่ดี.

เอกสารบอกว่ามันควรได้รับอนุญาต

 info date 'Date input formats' 'Calendar date items'

สำหรับเดือนที่เป็นตัวเลขอนุญาตให้ใช้รูปแบบ ISO 8601 'YEAR-MONTH-DAY' โดยที่ YEAR เป็นตัวเลขบวก ...

จะต้องมีศูนย์นำหน้าถ้าจำนวนน้อยกว่าสิบ

ถ้า YEAR น้อยกว่า 68 ปี 2000 จะถูกเพิ่มเข้าไป มิฉะนั้นถ้า YEAR น้อยกว่า 100 ดังนั้น 1900 จะถูกเพิ่มเข้าไป

คุณใช้ระบบ 32 บิตหรือไม่?

คุณได้รับข้อผิดพลาดกับวันที่หลังปี 2038-01-20 เช่นกัน

date -d '2038-01-20'

ถ้าเป็นเช่นนั้นดูเหมือนว่าวันที่ของ GNU กำลังใช้ค่าเวลา 32 บิต

ฉันไม่แน่ใจว่าคุณจะแก้ไขปัญหานี้ได้อย่างไรนอกจากใช้ระบบ 64 บิตหรือใช้เครื่องมือที่แตกต่างกันเช่นDateTimeใน Perl หรือdatetimeใน Python

พื้นหลังบางส่วน:

เวลา Unix จะนับจำนวนวินาทีตั้งแต่ 1 มกราคม 1970 โดยใช้ค่าจำนวนเต็ม หากระบบใช้จำนวนเต็ม 32 บิตจะสามารถนับได้ 2.1 พันล้านวินาทีไปข้างหน้า (สูงสุด 2038-01-19 03:14:02 UTC) และ 2.1 พันล้านวินาทีย้อนหลัง (กลับไปที่ 1901-12-13 20:45:52 UTC)

ข้อมูลเพิ่มเติมได้ที่:


ขอบคุณ Mikel ฉันเชื่อว่าฉันเป็นเครื่อง 32 บิต ที่จริงแล้วฉันกำลังทำงานกับเซิร์ฟเวอร์ระยะไกลและเซิร์ฟเวอร์จะไม่เปิดเผยข้อมูลมากนักแม้จะมีunameคำสั่งยกเว้นข้อเท็จจริงที่ว่ามันบอกว่าเป็นเครื่อง i686 ซึ่งฉันถือว่าเป็นเครื่อง 32 บิต สำหรับปัญหา 2038 ใช่ปัญหานั้นมี infact ในเซิร์ฟเวอร์ระยะไกล ขอบคุณอีกครั้งสำหรับข้อมูลของคุณ! ชื่นชมมาก !!
Jasdeep Singh

ใช่ i686 คือ 32 บิต ดีใจที่ได้ช่วยเหลือ หากคุณต้องการความช่วยเหลือในการจัดการกับวันที่ที่เก่ากว่านั้นลองใช้โมดูล Python และ Perl ที่ฉันแนะนำและโพสต์คำถามอื่นถ้าคุณไม่สามารถทำงานได้
Mikel

7

ระบบของคุณ (หรืออย่างน้อยว่ารุ่นของวัน ) อาจจะใช้ค่าเวลา 32 บิตภายใน

ยุค Unix (ค่าเวลาเป็นศูนย์) คือ 1970-01-01 00:00:00 UTC จุดเริ่มต้นนี้ทำให้ 1901-12-13 00:00 EST อยู่นอกช่วงของค่าเวลาแบบ 32 บิตที่ลงชื่อแล้ว

1901-12-14 00:00:00 EST คือ -2147454000
1901-12-13 15:45:52 EST คือ -2147483648 (aka INT_MINใน C จำนวนเต็มที่ลงชื่อขั้นต่ำ 32 บิต)
1901-12-13 00:00: 00 EST คือ -2147540400

คุณสามารถลองใช้ 1901-12-13 15:45:52 EST ควรใช้งานได้ แต่ก่อนหน้านี้หนึ่งวินาทีอาจจะล้มเหลวในลักษณะเดียวกับ 1901-12-13 00:00

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