2010-04-13 18 views
6

How do I elegantly print the date in RFC822 format in Perl? का एक ऑफशूट, लेकिन विंडोज विशिष्ट।मैं विंडोज पर पर्ल में% z (टाइमज़ोन) प्रारूप को सुंदर ढंग से कैसे प्रिंट करूं?

पर खिड़कियों:

 
    C:\> perl -MPOSIX 
    print strftime('%z', localtime()),"\n"; 

पैदावार:

 Central Daylight Time

मैं उम्मीद कर रहा था:

 -0500

के रूप में किसी को भी एक Linux सिस्टम पर होगा। मैं विंडोज़ पर "-0500" कैसे प्राप्त कर सकता हूं?

अद्यतन:

यह वास्तव में अपनी जगह में क्या करना भयानक है?

C:\> perl -MPOSIX 
sub tzoffset { 
    my $t = time(); 
    my $utc = mktime(gmtime($t)); 
    my $local = mktime(localtime($t)); 

    return ($local - $utc); 
} 

sub zformat { 
    my ($tzoffset) = @_; 
    my $z = ''; 
    if ($tzoffset < 0) { 
     $z .= '-'; 
     $tzoffset *= -1; 
    } 
    my $hours = floor($tzoffset/60/60); 
    my $minutes = $tzoffset - $hours * 60 * 60; 
    $z .= sprintf('%02d%02d', $hours, $minutes); 
    return $z; 
} 

print zformat(tzoffset()),"\n"; 

(मान लें मैं दिनांक समय स्थापित करने या किसी भी तरह से पैकेज की अनुमति नहीं कर रहा हूँ) समस्या मैंने देखा है यह रिटर्न कि -0600-0500 बनाम (जो मैं उम्मीद थी), लेकिन मेरा अनुमान है कि है डीएसटी गणना या कुछ के कारण है? मैं मुख्य रूप से एक सभ्य अनुमान लगाने की तलाश में हूं, लेकिन मुझे पता नहीं लगा कि mktime() डीएसटी के साथ क्यों खेल रहा है?

अद्यतन:

बाहर मिला कि tzoffset() भी बहुत कुछ "स्थिर" डीएसटी के मामले में हो सकता है अगर आप सिर्फ मैन्युअल डीएसटी बंद बाध्य करते हैं।

sub tzoffset { 
    my $t = time(); 
    my $utc = mktime(gmtime($t)); 
    my @tmlocal = localtime($t); 
    $tmlocal[8] = 0; # force dst off, timezone specific 
    my $local = mktime(@tmlocal); 

    return ($local - $utc); 
} 

इस तरह, कोई फर्क नहीं पड़ता अगर आप डीएसटी या नहीं कर रहे हैं, यह हमेशा -0500 वापस आ जाएंगे, जो है कि तुम क्या %z से चाहते हैं।

उत्तर

5

मुझे लगता है कि क्योंकि

  1. %z लिनक्स विशिष्ट
  2. Windows पर यह किसी भी तरह हो रहा है है कारण आप पूर्व हो रही है है सब केस-संवेदी आप पर और बदले अपर-केस जेड उठा।

मैनपेज से:

%Z Time zone name or abbreviation, or no bytes if no time 
     zone information exists. 

इसके अलावा, "% z" लिनक्स विशिष्ट हो रहा है - पर सोलारिस काम नहीं करता है या तो:

$ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"' 
%z 
$ perl -MPOSIX -e 'print strftime("%Z", localtime()),"\n"' 
EDT 

लिनक्स मैं पर जबकि प्राप्त करें:

$ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"' 
-0400 

यदि आपके पास DateTime::Format स्थापित है, तो मुझे लगता है कि यह पीओडी के आधार पर %z का समर्थन कर सकता है। मैंने इसे इंस्टॉल नहीं किया है, इसलिए अभी तक परीक्षण नहीं कर सकता है

डेटटाइम डेटटाइम :: प्रारूप के बिना भी इसका समर्थन कर सकता है।

+0

मुझे लगता है कि आप सही हैं, लेकिन मैं बस कुछ सभ्य होने की उम्मीद कर रहा था ...और मैं% जेड बनाम% z बात जो मैंने सोचा था कि एक तरह से व्यंग्यात्मक था के रूप में विंडोज केस-संवेदी है हर जगह, क्यों strftime नहीं() प्रारूप तार नोटिस किया था – dlamotte

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

  • कोई संबंधित समस्या नहीं^_^