Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Erläuterung der Verwendung von Perl-Zeitverarbeitungsfunktionen

Detaillierte Erläuterung der Verwendung von Perl-Zeitverarbeitungsfunktionen

巴扎黑
巴扎黑Original
2017-09-05 11:22:421757Durchsuche

Dieser Artikel konzentriert sich auf das Konzept der Perl-Zeitverarbeitungsfunktionen. Perl kann auf den meisten Betriebssystemen ausgeführt werden und kann problemlos auf verschiedene Betriebssysteme migriert werden. Perl hat Ideen von C, sed, awk, Shellscripting und vielen anderen Programmiersprachen übernommen. Funktionen

1. Perl-Zeitdarstellungsfunktion

1. Es gibt viele Möglichkeiten, Datumsangaben darzustellen:
"18.01.1973";
"18/01 / 1973";
"18.01.1973";
"Jan181973";
"18-01-73";
"18-01-1973";
"01/ 73 ".
Einige der Formate sind unklar (zum Beispiel „01-06-1973“, bedeutet das den 1. Juni oder den 6. Januar?)
Wenn das Datumsdarstellungsformat nicht angegeben ist, ist es schwierig zu handhaben .

Um den Unterschied zwischen „18Jan1973“ und „6Sep1950“ zu verstehen, müssen Sie sie in numerische Darstellungen umwandeln.
Unix verwendet intern Epochensekunden, um die Zeit darzustellen.
Die Summe aus Datum und Uhrzeit stellt Folgendes dar:
Die Anzahl der Sekunden zwischen Mitternacht (Epoche) am 1. Januar 1970 GMT und dem aktuellen Zeitpunkt.
Beispiel: „18. Januar 1973: Die Epochensekunde (angenommen Mitternacht) ist 96163200.

2. In diesem System stellt Mitternacht den Beginn des Tages dar.

Lassen Sie uns ein Datum über die in Perl bereitgestellte gmtime-Funktion generieren.
Angesichts einer Ganzzahl, die die Anzahl der Sekunden seit der Epoche darstellt, können das entsprechende Datum und die entsprechende Uhrzeit über die gmtime-Funktion berechnet werden,
Beispiel 1:
Rufen Sie die Funktion gmtime() auf und Sie erhalten eine Liste mit Werten, einschließlich Stunden, Minuten, Sekunden, Datumsangaben, Monaten, Jahren usw.


#!/usr/bin/perl
use Time::localtime;

$t_num = 96163200;
$tm = scalar(gmtime($t_num));
print $tm,"\n";

Ausgabe:
Do, 18. Jan. 00:00:00 1973

Beispiel 2: Verwenden Sie "," als Trennzeichen, um die Uhrzeit auszugeben
print join(",", gmtime(96163200));

0, 0,0,18,0,73,4,17,0
Semantik:
Die ersten drei Zahlen: 0,0,0, repräsentieren Sekunden, Minuten und Stunden von 0-. 23, also ist der Nachmittag nach 12 Uhr.
Die 4. Zahl: 18 stellt die Anzahl der Tage im Monat dar (in diesem Fall der 18.). Die 5. Zahl: 0 stellt den Monat dar. beginnend bei 0 (darstellend für die Anzahl der Tage im Monat Januar).

Die 6. Zahl: Die Darstellung von 73, Jahr (in diesem Fall 73), ist etwas Besonderes. Sie stellt nicht die letzten beiden Ziffern des Jahres dar.
Warum wird sie so dargestellt?

Das liegt daran, dass die C-Sprache dies so handhabt.

Perl versucht, seine Bibliotheken und Systemaufrufe so nah wie möglich an die Handhabung des Betriebssystems anzupassen.
Wenn Sie also eine 4 ausgeben möchten -stelliges Jahr wird wie folgt ausgedrückt:

@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
$month = @months[(gmtime($t_num))[4]];
print "MONTH: ",$month,"\n";


Wenn Sie diese Verarbeitungsmethode nicht verstehen, wird dies zu Y2K-Zweifeln führen. Sie könnten so schreiben:
$year= „19“ : 17, der Tag des Jahres (0 bedeutet der erste Tag des Jahres).
Die neunte Zahl: 0, ob die Sommerzeit übernommen werden kann (0 bedeutet, sie nicht zu verwenden, eine positive Zahl bedeutet, sie zu verwenden es, eine negative Zahl bedeutet, dass es unbekannt ist).


3. Die Funktion time() in Perl gibt das aktuelle Datum und die aktuelle Uhrzeit in Epochensekunden zurück $year=(gmtime(96163200))[5]+1900;

Wenn Sie planen Um es in eine Zeichenfolge umzuwandeln, können Sie gmtime(. ) und die Funktion localtime() verwenden:



Wenn localtime() oder gmtime() Wird ohne Parameter aufgerufen, ruft es time() selbst auf



2. Perl-Zeitverarbeitungsfunktion (Datums- und Uhrzeitoperationen)
$now=localtime(time());
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());


1. Um den Zeitraum zwischen zwei Momenten zu berechnen,


konvertieren Sie sie einfach in die entsprechenden Epochensekunden und subtrahieren Sie die beiden Zahlen:

$difference_in_seconds=$later_datetime- $earlier_datetime;
$now=localtime();
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime();

Um Sekunden in Minuten, Stunden oder Tage umzuwandeln, teilen Sie sie einfach durch 60, 3600 bzw. 86400:


2. Berechnen Sie „Was ist das Datum in 4 Tagen?“:



Die Antwort ist sekundengenau.

Beispiel:
$difference_in_minutes=$difference_in_seconds/60;
$difference_in_hours=$difference_in_seconds/3600;
$difference_in_day=$difference_in_seconds/86400;
Wenn der Epochensekundenwert 4 Tage später 932836935 ist, können Sie die Datumszeichenfolge wie folgt ausgeben:

Sa. 24. Juli 11:23:17 1999

3. Geben Sie die Mitternachtsstunde eines bestimmten Datums aus

wie „Sa. 24. Juli 00:00:00 1999“,
$then=time()+86400*4;
print scalar(localtime($then));
verwenden Sie das folgende Modul:

$then=$then-$then% 86400;#Entfernen Sie das Ende des Datums

Ebenso können Sie Rundungen verwenden, um das Datum auszugeben, das Mitternacht am nächsten liegt:



Wenn Ihr Dies funktioniert, wenn die Zeitzone eine gerade Anzahl von Stunden von GMT entfernt ist.
Nicht alle Zeitzonen sind einfach zu handhaben.

Was Sie wirklich brauchen, ist die Berechnung von Epochensekunden in Ihrer eigenen Zeitzone, nicht in GMT.


Ein Modul namens Time::Local in Perl,

kann zwei Funktionen timelocal() und timegm() bereitstellen. Der Rückgabewert ist derselbe wie bei localtime() und gmtime().


$then += 43200; #add on half a day
$then = $then - $then%86400; #truncate to the day



3. Darstellung von Datums- und Uhrzeitangaben, die im täglichen Leben in Perl-Zeitverarbeitungsfunktionen verwendet werden

前面介绍了时,分,年等值的意思,也了解了纪元秒的意思。
而日常生活中的日期和时间是用字符串来表示的,
怎样才能把日常所用的日期和时间串格式转换成纪元秒呢?

1. 要领之一是写出语法分析小程序,该要领灵活而高速:


#!/usr/bin/perl

use Time::Local;
@months{qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)}=(0..11);
$_ = "19 Dec 1997 15:30:02";
/(\d\d)\s+(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)/ or die "Notadate";


$mday=$1;
$mon=exists($months{$2})?$months{$2}:die"Badmonth";
$year=$3-1900;
($h,$m,$s)=($4,$5,$6);
$epoch_seconds = timelocal($s,$m,$h,$mday,$mon,$year);


print "day: ",$mday,"\n";
print "mon: ",$mon,"\n";
print "year: ",$year,"\n";
print "seconds: ",$epoch_seconds,"\n";

2. 一个更通用些的要领,是从CPAN安装Date::Manip模块。


useDate::Manip;
$epoch_seconds=UnixDate("19 Dec 1997 15:30:02","s");

留心,由于Date::Manip是个大模块,运用该模块时,将会添加你的程序的启动时间。
其中一个原由是Date::Manip将对多种不同的格式执行识别,
如:
"today"
"now"
"first sunday in april 2000"
"3:15,today"
"3:15 pm,first sunday in april 2000"
"2000/01/18 09:15" Date Manipulation
2036,2037,2038,…,1901?!

四. 大多数C程序把纪元秒存为有符号整数,可表示正的和负的日期;
但计算机存储器所表示的整数大小是有限的, 用有限的位数来表示秒.
这就是说,我们在计算纪元秒时, 所表示的日期是有限定的。
确切的限度取决于你的机器所能表示的整数的位数。

Perl最多以32位的长度存储整数。
粗略地讲,有一位用来表示正负号,其余31位来表示数。
如果8位,你可以存储的最大数是255,即2的8次方减1。
故Perl中所存储的32位符号数中的最大数为:


print 2**31-1,"\n";
2147483647

这个数字对应了哪个日期呢?


print scalar(gmtime(2**31-1)),"\n";
Tue Jan 19 03:14:07 2038

在那个时刻的1秒之后会发生什么呢?


print scalar(gmtime(2**31)),"\n";
Fri Dec 13 20:45:52 1901

对于32位有符号整数来说,2**31太大了。
它"翻卷过去了",其符号位被置为负号,因而成为了所能表示的最大负数。
这对应于1970年开始时刻之前的秒的最大值。
其结果说明了什么呢?你不能存储gmtime(2**31)之前或gmtime(2**31-1)之后的以纪元秒表示的日期。
你可千万不要想不开,这可不是什么大疑问。
如果你要用到32位有符号整数表示的纪元秒以外的时间,你只须要改动你的表示方式,
你可从CPAN中找到不少日期模块,其中的Date::Calc和Date::Manip很可能是功能最强的两个模块。
这两个模块运用自己的日期表示方式,以防止Y1901-Y2038的限定。
Date::Manip运用罗马历法,从公元0000到公元9999。
Date::Calc也运用罗马历法,可表示的年份从1到32767。

总结

Perl时间处理函数中对于在1902-2037范围内的日期和时期表示,把它们转换为纪元秒,
要存取这些数,你只需运用整数算术运算,gmtime()和localtime()函数,以及标准的Time::Local模块。
如果要对该范围以外的日期执行计算或者要分析某特殊的日期格式,
你可以运用CPAN中的Date::Manip和Date::Calc模块。

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von Perl-Zeitverarbeitungsfunktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn