Lokaltid: Hvordan man fortæller den aktuelle tid i Perl

Perl har en praktisk indbygget funktion til at finde den aktuelle dato og tid i dine scripts. Men når vi taler om at finde tiden, taler vi om den tid, der aktuelt er indstillet på maskinen, der kører scriptet. Hvis du f.eks. Kører dit Perl-script på din lokale maskine, returnerer localtime den aktuelle tid, du har indstillet, og sandsynligvis indstillet til din nuværende tidszone.

Når du kører det samme script på en webserver, kan du opleve, at lokal tid der er slukket fra lokaltid på dit desktop-system. Serveren er muligvis i en anden tidszone eller er indstillet forkert. Hver maskine kan have en helt anden idé om, hvad lokaltid er, og det kan tage nogle justeringer, enten inden for scriptet eller på selve serveren, for at få det til at matche det, du forventer.

Lokaltidsfunktionen returnerer en liste fuld af data om det aktuelle tidspunkt, hvoraf nogle skal justeres. Kør programmet nedenfor, og du vil se hvert element på listen udskrives på linjen og adskilt af mellemrum.

#! / Usr / local / bin / perl
@timeData = lokal tid (tid);
print join ('', @timeData);
instagram viewer

Du skulle se noget, der ligner dette, selvom antallet kan være meget forskelligt.

20 36 8 27 11 105 2 360 0

Disse elementer i den aktuelle tid er i rækkefølge:

  • Sekunder forbi minut
  • Minutter over timen
  • Timer efter midnat
  • Månedens dag
  • Måneder efter årets begyndelse
  • Antal år siden 1900
  • Antal dage siden ugens start (søndag)
  • Antal dage siden starten af ​​året
  • Hvorvidt eller ej sommertid er aktiv

Så hvis vi vender tilbage til eksemplet og forsøger at læse det, vil du se, at det er 08:36:20 AM den 27. december 2005, det er 2 dage efter søndag (tirsdag), og det er 360 dage siden starten af år. Sommertid er ikke aktiv.

Gør Perl-lokaliteten læsbar

Et par af elementerne i den matrix, som lokal tid returnerer, er lidt akavede at læse. Hvem vil tænke på det aktuelle år med hensyn til antallet af år efter 1900? Lad os se på et eksempel, der gør vores dato og tid klarere.

 #! / Usr / local / bin / perl

 @months = qw (jan. feb. mar. april. maj. jul. jul. sep. okt. nov. dec.);

 @weekDays = qw (sø ma. man. ons. fre. lør. søndag);

 ($ sekund, $ minut, $ time, $ dayOfMonth, $ måned, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();

 $ år = 1900 + $ årOffset;

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

 udskriv $ theTime; 

Når du kører programmet, skal du se en meget mere læselig dato og tid som dette:

 9:14:42, ons 28 december 2005 

Så hvad gjorde vi for at skabe denne mere læsbare version? Først forbereder vi to matriser med navnene på ugens måneder og dage.

 @months = qw (jan. feb. mar. april. maj. jul. jul. sep. okt. nov. dec.);

 @weekDays = qw (sø ma. man. ons. fre. lør. søndag); 

Da localtime-funktionen returnerer disse elementer i værdier fra henholdsvis 0-11 og 0-6, er de perfekte kandidater til en matrix. Værdien, der returneres ved lokal tid, kan bruges som en numerisk adresse til at få adgang til det korrekte element i matrixen.

 $ måneder [$ måned] $ ugeDage [$ dayOfWeek]


Det næste trin er at hente alle værdier fra localtime-funktionen. I dette eksempel bruger vi en Perl-genvej til automatisk at placere hvert element i lokaltidsarray i sin egen variabel. Vi har valgt navne, så det er let at huske, hvilket element der er.

 ($ sekund, $ minut, $ time, $ dayOfMonth, $ måned, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();


Vi er også nødt til at justere årets værdi. Husk, at lokal tid returnerer antallet af år siden 1900, så for at finde det aktuelle år, bliver vi nødt til at tilføje 1900 til den værdi, vi får.

 $ år = 1900 + $ årOffset;

Hvordan man fortæller den aktuelle GM-tid i Perl

Lad os sige, at du selv ønsker at undgå forvekslinger af tidszoner og selv tage kontrol over forskydningen. At få det aktuelle tidspunkt i lokal tid returnerer altid en værdi, der er baseret på maskinens tidszoneindstillinger - en server i USA vender tilbage én gang, mens en server i Australien returnerer en næsten en hel dag forskellig på grund af tidszonen forskelle.

Perl har en anden praktisk tidfortællingsfunktion, der fungerer nøjagtigt på samme måde som lokal tid, men i stedet for at returnere den tid, der er fastlagt til din maskins tidszone, det vender tilbage Koordineret universel tid (forkortet til UTC, også kaldet Greenwich gennemsnitstid eller GMT). Helt enkelt nok kaldes funktionen gmtime.

 #! / Usr / local / bin / perl

 @timeData = gmtime (tid);

 print join ('', @timeData); 

Bortset fra det faktum, at den returnerede tid vil være den samme på hver maskine, og i GMT er der ingen forskel mellem gmtime og localtime funktioner. Alle data og konverteringer udføres på samme måde.

 #! / Usr / local / bin / perl

 @months = qw (jan. feb. mar. april. maj. jul. jul. sep. okt. nov. dec.);

 @weekDays = qw (sø ma. man. ons. fre. lør. søndag);

 ($ sekund, $ minut, $ time, $ dayOfMonth, $ måned, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = gmtime ();

 $ år = 1900 + $ årOffset;

 $ theGMTime = "$ time: $ minut: $ sekund, $ ugedage [$ dayOfWeek] $ måneder [$ måned] $ dayOfMonth, $ year";

 udskriv $ theGMTime; 

  1. localtime returnerer den aktuelle lokale tid på den maskine, der kører scriptet.
  2. gmtime returnerer den universelle Greenwich-gennemsnitstid eller GMT (eller UTC).
  3. Returværdierne er muligvis ikke helt, hvad du forventer, så sørg for at konvertere dem efter behov.