Localtime: Jak zjistit aktuální čas v Perlu

Perl má praktickou vestavěnou funkci pro nalezení aktuálního data a času ve vašich skriptech. Když však hovoříme o nalezení času, mluvíme o době, která je aktuálně nastavena na počítači, na kterém je spuštěn skript. Pokud například spustíte skript Perl na místním počítači, místní čas vrátí aktuální čas, který jste nastavili, a pravděpodobně nastaví aktuální časové pásmo.

Při spuštění stejného skriptu na webovém serveru můžete zjistit, že místní čas je ve vašem stolním systému vypnutý. Server může být v jiném časovém pásmu nebo může být nastaven nesprávně. Každý počítač může mít úplně jinou představu o tom, co je místní čas, a může to vyžadovat nějaké úpravy, buď ve skriptu, nebo na samotném serveru, aby se přizpůsobilo tomu, co očekáváte.

Funkce localtime vrací seznam plný dat o aktuálním čase, z nichž některé bude třeba upravit. Spusťte program níže a uvidíte každý prvek v seznamu vytištěný na řádku a oddělený mezerami.

#! / usr / local / bin / perl
@timeData = localtime (time);
print join ('', @timeData);

Měli byste vidět něco podobného, ​​i když počet se může velmi lišit.

20 36 8 27 11 105 2 360 0

Tyto prvky aktuálního času jsou v tomto pořadí:

  • Sekundy za minutu
  • Minuty za hodinu
  • Hodiny po půlnoci
  • Den v měsíci
  • Měsíce po začátku roku
  • Počet let od roku 1900
  • Počet dní od začátku týdne (neděle)
  • Počet dní od začátku roku
  • Jestli ano nebo ne letní čas je aktivní

Takže pokud se vrátíme k příkladu a pokusíme se jej přečíst, uvidíte, že 27. prosince 2005 je 8:36:20 dopoledne, jsou to 2 dny po neděli (úterý) a je to 360 dní od začátku rok. Letní čas není aktivní.

Díky čitelnosti Perl Localtime

Několik prvků v poli, které se vrací místní čas, je trochu nepříjemné číst. Kdo by si vzpomněl na současný rok, pokud jde o počet let po roce 1900? Podívejme se na příklad, který objasňuje naše datum a čas.

 #! / usr / local / bin / perl

 @months = qw (leden únor duben květen červen červenec srpen srpen září říjen);

 @weekDays = qw (neděle Po Út St Čt Pá So Ne);

 ($ second, $ minute, $ hour, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();

 $ year = 1900 + $ yearOffset;

 $ theTime = "$ hour: $ minute: $ second, $ weekDays [$ dayOfWeek] $ month [$ month] $ dayOfMonth, $ year";

 print $ theTime; 

Při spuštění programu byste měli vidět mnohem čitelnější datum a čas, jako je tento:

 9:14:42, st 28. prosince 2005 

Co jsme tedy udělali, abychom vytvořili tuto čitelnější verzi? Nejprve připravíme dvě pole se jmény měsíců a dnů v týdnu.

 @months = qw (leden únor duben květen červen červenec srpen srpen září říjen);

 @weekDays = qw (neděle Po Út St Čt Pá So Ne); 

Protože funkce localtime vrací tyto prvky v hodnotách 0-11 a 0-6, jsou perfektními kandidáty na pole. Hodnota vrácená místním časem může být použita jako číselná adresa pro přístup ke správnému prvku v poli.

 $ month [$ month] $ weekDays [$ dayOfWeek]


Dalším krokem je získání všech hodnot z funkce localtime. V tomto příkladu používáme zkratku Perl k automatickému umístění každého prvku v poli localtime do jeho vlastní proměnné. Vybrali jsme si jména, aby bylo snadné zapamatovat si, který prvek je který.

 ($ second, $ minute, $ hour, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();


Musíme také upravit hodnotu roku. Pamatujte, že místní čas vrací počet let od roku 1900, takže abychom našli aktuální rok, musíme k hodnotě, kterou dostaneme, přidat 1900.

 $ year = 1900 + $ yearOffset;

Jak zjistit aktuální GM čas v Perlu

Řekněme, že se chcete vyhnout všem možným zmatkům v časovém pásmu a převzít kontrolu nad offsetem sami. Získání aktuálního času v lokálním čase vždy vrátí hodnotu, která je založena na nastavení časového pásma stroje - server v USA se vrátí jednou, zatímco server v Austrálii vrátí jeden téměř celý den jiný kvůli časové zóně rozdíly.

Perl má druhou užitečnou funkci vyprávění času, která funguje přesně stejným způsobem jako místní čas, ale místo vrácení času stanoveného pro váš stroj časové pásmo, vrací se Koordinovaný univerzální čas (ve zkratce UTC, nazývané také Greenwichský střední čas nebo GMT). Jednoduše se funkce volá gmtime.

 #! / usr / local / bin / perl

 @timeData = gmtime (čas);

 print join ('', @timeData); 

Kromě skutečnosti, že vrácený čas bude stejný na každém počítači a v GMT, není rozdíl mezi funkcemi gmtime a localtime. Všechna data a převody jsou prováděny stejným způsobem.

 #! / usr / local / bin / perl

 @months = qw (leden únor duben květen červen červenec srpen srpen září říjen);

 @weekDays = qw (neděle Po Út St Čt Pá So Ne);

 ($ second, $ minute, $ hour, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = gmtime ();

 $ year = 1900 + $ yearOffset;

 $ theGMTime = "$ hour: $ minute: $ second, $ weekDays [$ dayOfWeek] $ month [$ month] $ dayOfMonth, $ year";

 tisk $ theGMTime; 

  1. localtime vrátí aktuální místní čas na počítači, který spouští skript.
  2. gmtime vrátí univerzální Greenwichský střední čas, nebo GMT (nebo UTC).
  3. Návratové hodnoty nemusí být úplně to, co očekáváte, takže je musíte převést podle potřeby.