Lokaltid: Hur man berättar aktuell tid i Perl

click fraud protection

Perl har en praktisk inbyggd funktion för att hitta aktuellt datum och tid i dina skript. Men när vi pratar om att hitta tiden, pratar vi om den tid som för närvarande är inställd på maskinen som kör skriptet. Om du till exempel kör ditt Perl-skript på din lokala maskin kommer localtime att returnera den aktuella tiden du har ställt in och antagligen inställt på din nuvarande tidszon.

När du kör samma skript på en webbserver, kan det hända att lokaltid där är avstängd från lokaltid på ditt skrivbordssystem. Servern kan befinna sig i en annan tidszon eller ställa in felaktigt. Varje maskin kan ha en helt annan uppfattning om vad lokaltid är och det kan ta några justeringar, antingen inom skriptet eller på själva servern, för att få den att matcha det du förväntar dig.

Lokalitetsfunktionen returnerar en lista full av data om aktuell tid, varav några måste justeras. Kör programmet nedan så ser du varje element i listan tryckt på linjen och separerade med mellanslag.

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

Du borde se något liknande det, även om antalet kan vara väldigt annorlunda.

20 36 8 27 11 105 2 360 0

Dessa delar av aktuell tid är i ordning:

  • Sekunder förbi minuten
  • Minuter över timmen
  • Timmar över midnatt
  • Månadens dag
  • Månader över årets början
  • Antal år sedan 1900
  • Antal dagar sedan veckans början (söndag)
  • Antal dagar sedan årets början
  • Hurvida sommartid är aktiv

Så om vi återgår till exemplet och försöker läsa det, ser du att det är 08:36:20 AM den 27 december 2005, det är två dagar över söndagen (tisdag), och det är 360 dagar sedan starten av år. Sommartid är inte aktivt.

Att göra Perl-läget läsbart

Några av elementen i matrisen som lokal tid returnerar är lite besvärliga att läsa. Vem skulle tänka på det innevarande året i termer av antalet år tidigare 1900? Låt oss ta en titt på ett exempel som gör vårt datum och tid tydligare.

 #! / Usr / local / bin / perl

 @months = qw (jan feb mar apr maj jun jul aug sep okt nov nov dec);

 @weekDays = qw (Sön Man Tis Ons Tor Fre Lör Sön);

 ($ sekund, $ minut, $ timme, $ dayOfMonth, $ månad, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = lokaltid ();

 $ år = 1900 + $ årOffset;

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

 skriv ut $ theTime; 

När du kör programmet bör du se ett mycket mer läsbart datum och tid så här:

 9:14:42, ons 28 december 2005 

Så vad gjorde vi för att skapa den mer läsbara versionen? Först förbereder vi två matriser med namnen på veckans månader och dagar.

 @months = qw (jan feb mar apr maj jun jul aug sep okt nov nov dec);

 @weekDays = qw (Sön Man Tis Ons Tor Fre Lör Sön); 

Eftersom localtime-funktionen returnerar dessa element i värden som sträcker sig från 0-11 respektive 0-6 är de perfekta kandidater för en matris. Värdet som returneras med lokal tid kan användas som en numerisk adress för att komma åt rätt element i matrisen.

 $ månader [$ månad] $ veckaDagar [$ dayOfWeek]


Nästa steg är att få alla värden från lokaltidsfunktionen. I det här exemplet använder vi en Perl-genväg för att automatiskt placera varje element i lokaltidsuppsättningen i sin egen variabel. Vi har valt namn så att det är lätt att komma ihåg vilket element som är vilket.

 ($ sekund, $ minut, $ timme, $ dayOfMonth, $ månad, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = lokaltid ();


Vi måste också justera årets värde. Kom ihåg att lokal tid returnerar antalet år sedan 1900, så för att hitta det aktuella året måste vi lägga till 1900 till det värde vi får.

 $ år = 1900 + $ årOffset;

Hur man berättar aktuell GM-tid i Perl

Låt oss säga att du vill undvika alla möjliga tidszonförvirringar och själv ta kontroll över offset. Att få den aktuella tiden i lokal tid kommer alltid att returnera ett värde som är baserat på maskinens tidszoninställningar - en server i USA kommer att återvända en gång, medan en server i Australien kommer att returnera en nästan en hel dag annorlunda på grund av tidszonen skillnader.

Perl har en andra användbar tidsberättande funktion som fungerar på exakt samma sätt som lokal tid, men istället för att returnera den tid som är fast för din maskin tidszon, det returnerar Koordinerad universell tid (förkortat UTC, även kallad Greenwich Mean Time eller GMT). Enkelt nog kallas funktionen gmtime.

 #! / Usr / local / bin / perl

 @timeData = gmtime (tid);

 print join ('', @timeData); 

Utöver det faktum att tiden som returneras kommer att vara densamma på varje maskin och i GMT är det ingen skillnad mellan gmtime och localtime-funktionerna. All data och konverteringar görs på samma sätt.

 #! / Usr / local / bin / perl

 @months = qw (jan feb mar apr maj jun jul aug sep okt nov nov dec);

 @weekDays = qw (Sön Man Tis Ons Tor Fre Lör Sön);

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

 $ år = 1900 + $ årOffset;

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

 skriv ut $ theGMTime; 

  1. localtime kommer att returnera aktuell lokal tid på maskinen som kör skriptet.
  2. gmtime kommer att returnera den allmänna Greenwich Mean Time, eller GMT (eller UTC).
  3. Avkastningsvärdena är kanske inte riktigt vad du förväntar dig, så se till att du konverterar dem vid behov.
instagram story viewer