2010-04-13 2 views
6

Une branche dérivée de How do I elegantly print the date in RFC822 format in Perl?, mais spécifique à Windows.Comment est-ce que j'imprime élégamment le format de% z (timezone) dans Perl sur Windows?

Sur les fenêtres:

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

Rendement:

 Central Daylight Time

j'attendais:

 -0500

Comme tout le monde serait sur un système Linux. Comment puis-je obtenir le "-0500" sur Windows?

MISE À JOUR:

Est-ce vraiment terrible à faire à sa place? (En supposant que je ne suis pas autorisé à installer ou à emballer DateTime en aucune façon)

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"; 

Le problème que je l'ai remarqué est que ce retour -0600 vs -0500 (qui je pense), mais je pense que est dû aux calculs DST ou quelque chose? Je cherche principalement une approximation décente, mais je ne peux pas comprendre pourquoi mktime() joue avec DST?

MISE À JOUR:

découvert que tzoffset() peut être beaucoup plus « stable » en termes de DST si vous venez de forcer manuellement l'heure d'été éteint.

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); 
} 

De cette façon, peu importe si vous êtes DST ou non, ça va toujours revenir -0500 qui est ce que vous voulez de %z.

Répondre

5

Je pense que la raison pour laquelle vous obtenez l'ancien est parce que

  1. %z est spécifique à Linux
  2. Sur Windows, il va en quelque sorte tous insensible à la casse sur vous et ramassant à la place majuscules Z.

De manpage:

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

En outre, "% z" semble être spécifique à Linux - ne fonctionne pas sur Solaris soit:

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

alors que sur Linux I obtenir:

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

Si vous avez installé DateTime::Format, je pense qu'il pourrait supporter %z basé sur POD. Je ne l'ai pas installé donc ne peut pas encore tester

Aussi DateTime peut le prendre en charge sans le DateTime :: Format.

+0

Je pense que vous avez raison, mais j'espérais juste obtenir quelque chose de décent ...Et j'ai remarqué la chose% Z vs% z que je pensais être un peu ironique car Windows est sensible à la casse partout, pourquoi pas strftime() chaînes de format – dlamotte

Questions connexes