Perl heeft een handige ingebouwde functie voor het vinden van de huidige datum en tijd in uw scripts. Als we het echter hebben over het vinden van de tijd, hebben we het over de tijd die momenteel is ingesteld op de computer waarop het script wordt uitgevoerd. Als u bijvoorbeeld uw Perl-script op uw lokale computer uitvoert, retourneert localtime de huidige tijd die u hebt ingesteld en vermoedelijk ingesteld op uw huidige tijdzone.
Wanneer u hetzelfde script op een webserver uitvoert, kan het zijn dat localtime op uw desktopsysteem is uitgeschakeld vanaf localtime. De server bevindt zich mogelijk in een andere tijdzone of is onjuist ingesteld. Elke machine kan een totaal ander idee hebben van wat lokale tijd is en het kan enige aanpassing vereisen, hetzij in het script of op de server zelf, om het overeen te laten komen met wat u verwacht.
De functie Localtime retourneert een lijst met gegevens over de huidige tijd, waarvan sommige moeten worden aangepast. Voer het onderstaande programma uit en je ziet elk element in de lijst op de regel worden afgedrukt en gescheiden door spaties.
#! / usr / local / bin / perl
@timeData = localtime (tijd);
print join ('', @timeData);
Je zou iets dergelijks moeten zien, hoewel het aantal heel anders kan zijn.
20 36 8 27 11 105 2 360 0
Deze elementen van de huidige tijd zijn, in volgorde:
- Seconden voorbij de minuut
- Minuten voorbij het uur
- Uren na middernacht
- Dag van de maand
- Maanden voorbij het begin van het jaar
- Aantal jaren sinds 1900
- Aantal dagen sinds het begin van de week (zondag)
- Aantal dagen sinds het begin van het jaar
- Wel of niet zomertijd is actief
Dus als we terugkeren naar het voorbeeld en proberen het te lezen, ziet u dat het 27:36:20 uur is op 27 december 2005, het is 2 dagen na zondag (dinsdag) en het is 360 dagen sinds het begin van de jaar. Zomertijd is niet actief.
De Perl Localtime leesbaar maken
Een paar elementen in de array die localtime retourneert, zijn een beetje lastig om te lezen. Wie zou denken van het lopende jaar in termen van het aantal jaren na 1900? Laten we een voorbeeld bekijken dat onze datum en tijd duidelijker maakt.
#! / usr / local / bin / perl
@months = qw (jan feb mrt apr mei jun jul aug sep okt nov dec dec);
@weekDays = qw (zon ma di wo do vr za zo);
($ seconde, $ minuut, $ uur, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();
$ jaar = 1900 + $ jaar Offset;
$ theTime = "$ uur: $ minuut: $ seconde, $ weekDagen [$ dayOfWeek] $ maanden [$ month] $ dayOfMonth, $ jaar";
print $ theTime;
Wanneer u het programma uitvoert, ziet u een veel leesbaardere datum en tijd als volgt:
9:14:42, wo 28 december 2005
Dus wat hebben we gedaan om deze beter leesbare versie te maken? Eerst bereiden we twee arrays voor met de namen van de maanden en dagen van de week.
@months = qw (jan feb mrt apr mei jun jul aug sep okt nov dec dec);
@weekDays = qw (zon ma di wo do vr za zo);
Aangezien de localtime-functie deze elementen retourneert in waarden variërend van respectievelijk 0-11 en 0-6, zijn ze perfecte kandidaten voor een array. De waarde die door localtime wordt geretourneerd, kan worden gebruikt als een numeriek adres om toegang te krijgen tot het juiste element in de array.
$ maanden [$ month] $ weekDays [$ dayOfWeek]
De volgende stap is om alle waarden uit de localtime-functie te halen. In dit voorbeeld gebruiken we een Perl-snelkoppeling om elk element in de localtime array automatisch in zijn eigen variabele te plaatsen. We hebben namen gekozen zodat het gemakkelijk is om te onthouden welk element welk is.
($ seconde, $ minuut, $ uur, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = localtime ();
We moeten ook de waarde van het jaar aanpassen. Vergeet niet dat localtime het aantal jaren sinds 1900 retourneert, dus om het huidige jaar te vinden, moeten we 1900 optellen bij de waarde die we krijgen.
$ jaar = 1900 + $ jaar Offset;
Hoe de huidige GM-tijd in Perl te vertellen
Laten we zeggen dat u alle mogelijke verwarring in de tijdzone wilt voorkomen en zelf de compensatie wilt overnemen. Door de huidige tijd in lokale tijd op te halen, wordt altijd een waarde geretourneerd die is gebaseerd op de tijdzone-instellingen van de machine - een server in de VS zal één keer terugkeren, terwijl een server in Australië er een bijna een hele dag anders retourneert vanwege de tijdzone verschillen.
Perl heeft een tweede handige tijdtelfunctie die op precies dezelfde manier werkt als lokale tijd, maar in plaats van de tijd terug te geven die is vastgesteld voor uw machine tijdzonehet keert terug Gecoördineerde universele tijd (afgekort als UTC, ook wel Greenwich Mean Time of GMT genoemd). Eenvoudig genoeg wordt de functie genoemd gmtime.
#! / usr / local / bin / perl
@timeData = gmtime (tijd);
print join ('', @timeData);
Anders dan het feit dat de geretourneerde tijd op elke machine en in GMT hetzelfde is, is er geen verschil tussen de gmtime- en localtime-functies. Alle gegevens en conversies worden op dezelfde manier uitgevoerd.
#! / usr / local / bin / perl
@months = qw (jan feb mrt apr mei jun jul aug sep okt nov dec dec);
@weekDays = qw (zon ma di wo do vr za zo);
($ seconde, $ minuut, $ uur, $ dayOfMonth, $ month, $ yearOffset, $ dayOfWeek, $ dayOfYear, $ daylightSavings) = gmtime ();
$ jaar = 1900 + $ jaar Offset;
$ theGMTime = "$ uur: $ minuut: $ seconde, $ weekDagen [$ dayOfWeek] $ maanden [$ month] $ dayOfMonth, $ jaar";
print $ theGMTime;
- localtime retourneert de huidige lokale tijd op de computer waarop het script wordt uitgevoerd.
- gmtime retourneert de universele Greenwich Mean Time of GMT (of UTC).
- De geretourneerde waarden zijn mogelijk niet helemaal wat u verwacht, dus zorg ervoor dat u ze converteert als dat nodig is.