2016-07-08 12 views
7

मैंने हाल ही में how to change the timezone returned by localtime in Perl सीखा।'लोकलटाइम' कॉल करने से पहले पर्ल स्क्रिप्ट को 'tzset` को कॉल करने की आवश्यकता कब होती है?

use POSIX qw(tzset); 
print localtime . "\n"; 
$ENV{TZ} = 'America/Los_Angeles'; 
print localtime . "\n"; 
tzset; 
print localtime . "\n"; 

आउटपुट

Wed Apr 15 15:58:10 2009 
Wed Apr 15 15:58:10 2009 
Wed Apr 15 12:58:10 2009 

सूचना कैसे घंटे केवल tzset बुला के बाद बदल जाता है।

This is perl, v5.8.8 built for x86_64-linux-thread-multi 

लेकिन, मेरा सिस्टम पर मैं हो रही है,

Fri Jul 8 19:00:51 2016 
Fri Jul 8 16:00:51 2016 
Fri Jul 8 16:00:51 2016 

सूचना कैसे अपने सिस्टम पर, घंटे बुला tzset बिना बदल जाता । यह सोलारिस 10

तो पर Ubuntu और Illumos, साथ ही पर्ल v5.8.8 में पर्ल के हाल के संस्करणों पर सच है मेरे सारे परीक्षण इशारा करता है, तो tzset कोई प्रभाव नहीं है, क्यों/अन्य क्या सिस्टम की आवश्यकता होती है tzset स्पष्ट रूप से कहा जा है कि? क्या मुझे अभी भी कुछ वातावरण के साथ संगत रहने के लिए tzset पर कॉल करने की आवश्यकता है, या अब यह अतीत की बात है?

+1

http://perldoc.perl.org/perlport.html#Time-and-Date tl; dr - प्रणाली और दिन की तारीख के सिस्टम की धारणा व्यापक रूप से अलग-अलग तरीकों से नियंत्रित होती है। मान लें कि टाइमज़ोन $ ENV {TZ} में संग्रहीत है, और यहां तक ​​कि यदि यह भी है, तो यह न मानें कि आप उस चर के माध्यम से टाइमज़ोन को नियंत्रित कर सकते हैं। – xxfelixxx

+0

मुझे कुछ विशिष्ट चाहिए। मेरा परीक्षण इंगित करता है कि 'tzset' को कॉल न करना सुरक्षित है। चूंकि यहां सॉफ्टवेयर केवल विशिष्ट प्लेटफार्मों के लिए है, इसलिए मैं अपनी टीम को अतिरिक्त काम करने के लिए नहीं बताना चाहता हूं जिसकी आवश्यकता नहीं है। तो, हमें किस स्थिति में 'tzset' की आवश्यकता है? –

+1

एक उत्तर पोस्ट और हटा दिया गया था, लेकिन http://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.html से लिंक, जो कहता है * "स्थानीय टाइमज़ोन जानकारी का उपयोग स्थानीय समय() को tzset() कहते हैं। "*, तो ऐसा लगता है कि सिस्टम 'लोकलटाइम' को स्वचालित रूप से 'tzset'' कॉल करना चाहिए यदि सिस्टम POSIX-compliant है ??? क्या यह परिभाषित कारक है - क्या ओएस पॉज़िक्स-अनुरूप है? –

उत्तर

4

टी एल; डॉ: Perl v5.8.9 (2011 में जारी) tzset बुला जब बदलते $ENV{TZ} अब कोई आवश्यकता नहीं है के साथ शुरू।


पर्ल के localtime कॉल localtime_r(3)internally, जो tzset(3) कॉल करने के लिए आवश्यक नहीं है। Linux manpage सलाह देता है:

POSIX.1-2004 के अनुसार, स्थानीयसमय() जबकि localtime_r() इस आवश्यकता नहीं है, व्यवहार करने के लिए के रूप में यद्यपि tzset (3) कहा जाता था की आवश्यकता है। पोर्टेबल कोड tzset (3) के लिए localtime_r() से पहले बुलाया जाना चाहिए।

बड़े गैर बहु ​​पर्ल्स में, या यदि localtime_r(3) निर्माण के दौरान उपलब्ध नहीं था, localtime(3) बजाय प्रयोग किया जाता है। उस मामले में, tzset के लिए एक कॉल अनावश्यक हो गया होता, per POSIX:

स्थानीय समय क्षेत्र जानकारी के रूप में यद्यपि स्थानीयसमय प्रयोग किया जाता है() tzset() कॉल

हालांकि ऐसे कालखण्ड आते रहे जहां glibc didn't adhere to that है लगता है :

किसी भी कोड है जो tzset हर समय फोन नहीं करता है के लिए के रूप में: इस निश्चित रूप से नहीं बदलेगा। यह बहुत महंगा है। और किस लिए? 0.000001% जो लोग विश्व दौरे पर लैपटॉप लेते हैं और उम्मीद करते हैं, उदाहरण के लिए, देशी टाइमज़ोन के अनुसार तारीखों के साथ syslog संदेश। यह पर्याप्त औचित्य नहीं है। बस अपनी मशीन को पुनरारंभ करें।

यह हालांकि परिवर्तन किया था और glibc अब कार्य करता है के रूप में यदि tztime(3) बुलाया गया था, लेकिन केवल गैर रैत्रांत localtime जो नहीं हो सकता है कि आपके पर्ल का उपयोग करने के लिए संकलित किया गया था।

इस बारे में दो पर्ल बग रिपोर्टें हैं: #26136 और #41591

एक फिक्स के रूप में, पर्ल अब decides at configuration time चाहे एक अंतर्निहित tzset(3) किया जाना चाहिए, जो इसे उपयोगकर्ता कोड में अनिवार्य रूप से निर्दिष्ट करता है।

संबंधित मुद्दे

 संबंधित मुद्दे