ทำไมจำนวนเต็มที่ลงนามจึงถูกใช้เพื่อแทนการประทับเวลา? มีจุดเริ่มต้นที่ชัดเจนในปี 1970 ที่แสดงเป็น 0 ดังนั้นทำไมเราต้องใช้ตัวเลขก่อนหน้านั้น มีการใช้การประทับเวลาเชิงลบทุกที่หรือไม่
ทำไมจำนวนเต็มที่ลงนามจึงถูกใช้เพื่อแทนการประทับเวลา? มีจุดเริ่มต้นที่ชัดเจนในปี 1970 ที่แสดงเป็น 0 ดังนั้นทำไมเราต้องใช้ตัวเลขก่อนหน้านั้น มีการใช้การประทับเวลาเชิงลบทุกที่หรือไม่
คำตอบ:
เวอร์ชันแรกของ C ไม่มีจำนวนเต็มที่ไม่ได้ลงนาม (โปรแกรมเมอร์บางคนใช้พอยน์เตอร์เมื่อพวกเขาต้องการเลขคณิตที่ไม่ได้ลงชื่อ) ฉันไม่รู้ว่าอันไหนมาก่อนtime()
ฟังก์ชั่นหรือประเภทที่ไม่ได้ลงนาม แต่ฉันสงสัยว่าการเป็นตัวแทนถูกสร้างขึ้นก่อนประเภทที่ไม่ได้ลงนาม และในปี 2038 ก็เพียงพอแล้วในอนาคตที่อาจไม่น่าเป็นห่วง ฉันสงสัยว่าหลายคนคิดว่า Unix จะยังคงมีอยู่ในตอนนั้น
ข้อดีอีกอย่างของการเซ็นชื่อtime_t
คือการขยายไปถึง 64 บิต (ซึ่งกำลังเกิดขึ้นในบางระบบ) ช่วยให้คุณสามารถแสดงเวลาหลายร้อยพันล้านปีในอนาคตโดยไม่สูญเสียความสามารถในการเป็นตัวแทนครั้งก่อนปี 1970 (นั่นคือเหตุผลที่ฉันคัดค้านไม่ได้ลงชื่อ แบบ 32 บิตtime_t
เรามีเวลาพอที่จะเปลี่ยนเป็น 64 บิต)
time
ฟังก์ชั่นเก่ากว่ายุค: Unix v1 (ในปี 1971) นับในหน่วยของ 1 / 60th ของวินาทีจากเที่ยงคืนวันที่ 1971/01/01 มันเป็นข้อผิดพลาดที่รู้จักกันดี อยู่แล้วว่า“ ผู้ใช้ที่คำนึงถึงลำดับเหตุการณ์จะทราบว่า 2 * 32 sixtieths ของ asecond นั้นใช้เวลาเพียง 2.5 ปีเท่านั้น”unsigned
เปิดตัวโดยK&R ในปี 1978หลังจากยุค 1970 ก่อตั้งขึ้น
gmtime
และlocaltime
สูงสุดในปี 2147483647 (กับวินาทีถัดไปหลังจากให้ -2147483648 เป็นปี) ดังนั้นเพื่อให้ได้เวลา 55 บิตที่ผ่านมาบางคนจะต้องอัพเดตรูทีนเอาต์พุตเพื่อใช้ int 64- บิตสำหรับปีแทนที่จะเป็น int 32- บิตที่ไม่ได้ลงนาม หวังว่าใครบางคนจะดูแลบั๊กนั้นในอีกไม่กี่พันล้านปีข้างหน้า
struct tm
ประเภทมีสมาชิกtm_year
(คิดปีนับตั้งแต่ปี 1900) int
ซึ่งเป็นชนิด ระบบ 64 บิตสามารถมี 64 บิตtime_t
แต่พวกเขามักจะมี int
32 (ถ้าchar
เป็น 8 บิตและint
64 บิตก็short
สามารถเป็นได้ทั้ง 16 หรือ 32 บิตและจะไม่มีประเภทที่กำหนดไว้ล่วงหน้าสำหรับขนาดอื่น ๆ ) แต่time()
อาจเป็นฟังก์ชั่นเดียวเท่านั้น<time.h>
ที่ต้องใช้การสนับสนุนระดับระบบ คุณสามารถเขียนโค้ดของคุณเองเพื่อแปลงtime_t
ค่าเป็นสตริงที่มนุษย์อ่านได้
มันให้การสนับสนุนการประทับเวลาและวันที่ก่อนวันที่ 1 มกราคม 1970
time_t
เป็น 32 บิตเท่านั้น มันมีอยู่แล้ว 64 บิตในหลาย ๆ ระบบ
mktime()
ฟังก์ชันส่งคืน-1
ในกรณีที่เกิดข้อผิดพลาดดังนั้นจึงเป็นไปไม่ได้ที่จะแยกแยะระหว่างการประทับเวลาที่ถูกต้องก่อน 1970-01-01 และข้อผิดพลาด ts ไม่อนุญาตให้มีการนัดล่วงหน้าก่อนวันที่ 1970-01-01
1969-12-31 23:59:59 UTC
มันเป็นเรื่องยากที่จะแยกแยะความแตกต่างระหว่างข้อผิดพลาดและเวลาที่เฉพาะเจาะจง ค่าลบอื่น ๆ ที่นอกเหนือจาก-1
นั้นจะไม่คลุมเครือ
mktime()
errno
(POSIX ทำ)