बैश - तारीख, 32 बिट लिनक्स सिस्टम पर 2038 बग के आसपास काम करना


9

मैंने थोड़ी सी बैश स्क्रिप्ट लिखी जिसने मुझे "वर्ष 2038 बग" में ठोकर मार दी । मुझे इस समस्या के बारे में पहले से पता नहीं था और मैं बस उस --debugआउटपुट को पोस्ट करने की हिम्मत करता था जो मुझे dateतब मिला जब मेरी स्क्रिप्ट ने इस जादुई तारीख (03:14:07 UTC पर 19 जनवरी 2038) की गणना करने की कोशिश की।

date -d "20380119"

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' = 2147468400 epoch-seconds
date: output timezone: +01:00 (set from system default)
date: final: 2147468400.000000000 (epoch-seconds)
date: final: (Y-M-D) 2038-01-18 23:00:00 (UTC0)
date: final: (Y-M-D) 2038-01-19 00:00:00 (output timezone TZ=+01:00)
Tue Jan 19 00:00:00 CET 2038

date -d "20380119 + 1 days"

date: parsed hybrid part: +1 day(s)
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: warning: when adding relative days, it is recommended to specify 12:00pm
date: error: adding relative date resulted in an invalid date: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: invalid date '20380119 + 1 days'

date -d "20380120" --debug

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: error: invalid date/time value:
date:     user provided time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date:        normalized time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: 
date:      possible reasons:
date:        numeric values overflow;
date:        missing timezone
date: invalid date '20380120'

क्या dateइस तिथि में जीएनयू की गणना करने का कोई तरीका है ?
(एक LINUX 32 बिट सिस्टम पर)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86

3
32 बिट सिस्टम में इसे प्राप्त करने का एक तरीका एक * बीएसडी ओएस का उपयोग कर रहा है।
रुई एफ रिबेरो

1
बैश न करें लेकिन: search.cpan.org/~mschwern/Time-y2038-20100403/lib/Time/y2038.pm
jesse_b

1
@ कुसलानंद को अस्पष्ट होने के लिए खेद है। हां, मैं जीएनयू के लिए एक तरीके के बारे में पूछ रहा हूं date। मैं अपने प्रश्न को संपादित करूँगा ...
नाथ

FWIW, OpenBSD ने तय किया कि 2014 में । यह बहुत काम था, लेकिन किसी तरह वे सभी प्रासंगिक बिट्स को पैच करने में कामयाब रहे।
शनि 23 कटुरा

जवाबों:


14

यदि आप date32-बिट लिनक्स पर जीएनयू से चिपके रहना चाहते हैं , तो 2038 के बाद तारीखों के साथ काम करने का कोई आसान तरीका नहीं है coreutilsअनुरक्षक इसे coreutilsबग नहीं मानते हैं , इसलिए वहां एक फिक्स की उम्मीद न करें - फिक्स होगा सी लाइब्रेरी और कर्नेल से आने के लिए । यदि आप प्रगति में काम के साथ खेलना चाहते हैं, तो आपको आवश्यकता होगी:

और कौशल और धैर्य की एक सभ्य राशि।

जिस तरह से 2038 को 32-बिट लिनक्स दुनिया में संभाला जाने की योजना थी, उसी तरह से LWN और 2038 BoF के राइट-अप को DebConf 17 (वहां और LWN पर अनुवर्ती टिप्पणियों के साथ ) देखें। यह जनवरी 2019 LWN लेख उन परिवर्तनों का वर्णन करता है जो कर्नेल में लागू किए जा रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.