2009-06-13 17 views
7

मैंने माना था कि यह $ENV{TZ} जितना आसान होगा, लेकिन TZ पर्यावरण चर सेट नहीं है, और फिर भी date कमांड अभी भी जानता है कि मैं ईडीटी में हूं, इसलिए टाइमज़ोन निर्धारित करने का कोई अन्य तरीका होना चाहिए (chomp(my $tz = qx/date +%Z/); कहने के अलावा) । लेकिन आप localtime() कहा जाता है, यह पहली जगह में स्थापित किया जाना के लिए की जरूरत है -मैं वर्तमान टाइमज़ोन कैसे निर्धारित कर सकता हूं कि एक मशीन पर्ल के साथ सेट की गई है?

+0

बस मेरे सिस्टम पर अतिरिक्त जानकारी के लिए, टाइमज़ोन फ़ाइल/etc/localtime द्वारा विनियमित है और libc को यह जानने के लिए प्रतीत होता है कि इसका उपयोग कैसे किया जाए। –

उत्तर

14
use POSIX; 
print strftime("%Z", localtime()), "\n"; 
+0

मैंने% Z के बारे में सोचा, लेकिन मुझे इसके बारे में कुछ याद है जो कुछ सिस्टम पर काम नहीं कर रहा है। –

+0

आदमी के अनुसार,% Z एक मानक विनिर्देश है और सभी प्लेटफार्मों पर समर्थित होना चाहिए। –

+1

मुझे लगता है कि मैं इसे पॉज़िक्स दस्तावेज़ों से याद कर रहा था: "ज़ेड" विनिर्देश कुख्यात रूप से अप्राप्य है क्योंकि टाइमज़ोन के नाम गैर-मानक हैं। संख्यात्मक विनिर्देशों के लिए चिपकना सबसे सुरक्षित मार्ग है। लेकिन मुझे लगता है कि यह मेरे उद्देश्यों के लिए शायद सुरक्षित है। –

5
use POSIX; 
localtime(); 
my ($std, $dst) = POSIX::tzname(); 

tzname() आप POSIX वैश्विक tzname तक पहुँच देता है।

6

आप कुछ POSIX की तुलना में अधिक पोर्टेबल (लेकिन शायद बहुत धीमी) आप इस के लिए दिनांक समय :: समय क्षेत्र का उपयोग कर सकते हैं:

use DateTime::TimeZone; 

print DateTime::TimeZone->new(name => 'local')->name(); 
1

हो सकता है कि यह तेजी से:

my @lt = localtime(12*60*60); 
my @gt = gmtime(12*60*60); 
$tz = @lt[2] - @gt[2]; 
$tz_ = sprintf("%+03d:00", $tz); # for +02:00 format 
+0

अपने उत्तर के पूरक के लिए आप [संपादित करें] (http://stackoverflow.com/posts/29400576/edit) बटन का उपयोग कर सकते हैं। – ZygD

0

अगर तुम सिर्फ जरूरत है +05:30 (यूटीसी + 5.5/भारत समय) जैसे कुछ, आप निम्न कोड का उपयोग कर सकते हैं।

my @lt = localtime(); 
my @gt = gmtime(); 

my $hour_diff = $lt[2] - $gt[2]; 
my $min_diff = $lt[1] - $gt[1]; 

my $total_diff = $hour_diff * 60 + $min_diff; 
my $hour = int($total_diff/60); 
my $min = abs($total_diff - $hour * 60); 

print sprintf("%+03d:%02d", $hour, $min); 

यह उत्तर ऊपर पावेल के उत्तर से प्रेरित है।

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

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