यूनिक्स एक हस्ताक्षरित पूर्णांक में टाइमस्टैम्प को क्यों स्टोर करता है?


24

टाइमस्टैम्प का प्रतिनिधित्व करने के लिए एक हस्ताक्षरित पूर्णांक का उपयोग क्यों किया जाता है? 1970 में एक स्पष्ट रूप से परिभाषित शुरुआत है जिसे 0 के रूप में दर्शाया गया है, इसलिए हमें उससे पहले नंबर की आवश्यकता क्यों होगी? क्या नकारात्मक टाइमस्टैम्प कहीं भी उपयोग किए जाते हैं?


2
इसीलिए नोस्ट्राडामस अपने कंप्यूटर का उपयोग 3000 वर्षों के लिए अपनी भविष्यवाणियाँ लिखने के लिए नहीं कर सका ... यह एक अतिप्रवाह का कारण बनेगा और उसकी तारीखों को नकारात्मक दिखाएगा। मुझे लगता है कि वे इसे Y3K बग या कुछ कहते हैं!
लीच

3
जब प्राचीन संख्याओं को ऋणात्मक से सकारात्मक में बदल दिया गया तो प्राचीन रोमनों की स्थिति और भी खराब थी। यदि वे संख्या शून्य व्यक्त करने का एक तरीका होता तो वे इसे Y0K समस्या कहते। 8-)}
कीथ थॉम्पसन

जवाबों:


35

C के प्रारंभिक संस्करणों में अहस्ताक्षरित पूर्णांक नहीं थे। (कुछ प्रोग्रामर्स ने अहस्ताक्षरित अंकगणित की आवश्यकता होने पर पॉइंटर्स का उपयोग किया।) मुझे नहीं पता कि कौन पहले आया था, time()फ़ंक्शन या अहस्ताक्षरित प्रकार, लेकिन मुझे संदेह है कि प्रतिनिधित्व निरूपित प्रकार सार्वभौमिक रूप से उपलब्ध होने से पहले स्थापित किया गया था। और 2038 भविष्य में पर्याप्त था कि यह शायद चिंता करने लायक नहीं था। मुझे संदेह है कि कई लोगों को लगा कि यूनिक्स तब भी मौजूद रहेगा।

एक हस्ताक्षरित का एक और लाभ time_tयह है कि इसे 64 बिट्स तक फैलाया जा रहा है (जो पहले से ही कुछ प्रणालियों पर हो रहा है) आपको 1970 से पहले के समय का प्रतिनिधित्व करने की क्षमता खोए बिना कई सौ अरब वर्षों के भविष्य का प्रतिनिधित्व करने देता है। (इसीलिए मैं एक स्विच करने का विरोध करता हूं 32-बिट अहस्ताक्षरित time_t ; हमारे पास 64 बिट्स में संक्रमण के लिए पर्याप्त समय है।)


7
यह timeकार्य युग से भी पुराना है: यूनिक्स v1 (1971 में) 1971/01/01 की मध्यरात्रि से एक सेकंड की 1/60 वीं इकाइयों में गिना जाता है। यह पहले से ही एक ज्ञात बग था कि "कालानुक्रमिक दिमाग वाला उपयोगकर्ता नोट करेगा कि 2 ** 32 एसेकंड के बारे में केवल 2.5 वर्ष है।" unsigned को एंड आर द्वारा 1978 में पेश किया गया था , 1970 के युग के बाद अच्छी तरह से स्थापित किया गया था।
गिल्स एसओ- बुराई को रोकें '

मैंने एक त्वरित परीक्षण किया और अपने 64-बिट लिनक्स बॉक्स पर। gmtimeऔर localtimeअधिकतम वर्ष 2147483647 (वर्ष के रूप में -2147483648 देने के बाद अगले सेकंड के साथ)। तो पिछले 55 बिट्स का अधिक समय पाने के लिए किसी को 32-बिट इंट के बजाय वर्ष के लिए 64-बिट इंट का उपयोग करने के लिए आउटपुट रूटीन को अपडेट करना होगा। उम्मीद है कि अगले कुछ अरब वर्षों में कोई न कोई उस बग की देखभाल करेगा।
Freiheit

@freiheit: दिलचस्प है। वहाँ समस्या यह है कि struct tmप्रकार में एक सदस्य है tm_year(1900 के बाद से वर्षों का प्रतिनिधित्व) जो प्रकार का है int। 64-बिट सिस्टम में आसानी से 64-बिट हो सकते हैं time_t, लेकिन उनके पास आमतौर पर 32-बिट होता है int। (यदि char8 बिट्स है और int64 बिट्स है, तो shortया तो 16 या 32 बिट्स हो सकता है, और दूसरे आकार का कोई पूर्वनिर्धारित प्रकार नहीं होगा।) लेकिन time()संभवतः केवल एक ही फ़ंक्शन है <time.h>जिसमें वास्तव में सिस्टम-स्तरीय समर्थन की आवश्यकता होती है; time_tमूल्यों को मानव-पठनीय तारों में बदलने के लिए आप अपना कोड लिख सकते हैं।
कीथ थॉम्पसन

12

यह 1 जनवरी, 1970 से पहले टाइमस्टैम्प और तिथियों का समर्थन करता है।


1
यह अतीत में केवल 68 साल बनाता है - 1902। यह काफी कम लगता है।
बाकुदन

2
POSIX time_tको केवल 32 बिट्स होने की आवश्यकता नहीं है ; यह पहले से ही कई प्रणालियों पर 64 बिट्स है।
कीथ थॉम्पसन

1
mktime()फ़ंक्शन -1त्रुटि के मामले में लौटाता है , इसलिए 1970-01-01 और त्रुटि ts से पहले सही टाइमस्टैम्प के बीच अंतर करना संभव नहीं है। 1970-01-01 से पहले स्पष्ट तारीखें निषिद्ध हैं
DimG

@DimG: एक त्रुटि और विशिष्ट टाइमस्टैम्प के बीच अंतर करना मुश्किल है 1969-12-31 23:59:59 UTC। इसके अलावा एक नकारात्मक मूल्य -1असंदिग्ध है।
कीथ थॉम्पसन

1
@mtraceur: C मानक mktime()को सेट करने में विफल कॉल की आवश्यकता नहीं है errno। (पोसिक्स करता है।)
कीथ थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.