Explication détaillée de l'utilisation des fonctions de traitement du temps Perl

巴扎黑
Libérer: 2017-09-05 11:22:42
original
1727 Les gens l'ont consulté

Cet article se concentre sur le concept des fonctions de traitement du temps Perl. Perl peut fonctionner sur la plupart des systèmes d'exploitation et peut être facilement migré vers différents systèmes d'exploitation. Perl a emprunté des idées à C, sed, awk, shellscripting et à de nombreux autres langages de programmation. Caractéristiques

1. Fonction de représentation du temps Perl

1 Il existe de nombreuses façons de représenter les dates :
"18Jan1973";
"18/01 /. 1973";
"18/01/1973";
"18 janvier 1973";
"18-01-73";
"18-01-1973";
"01/ 73 ".
Certains formats ne sont pas clairs (par exemple, "01-06-1973", cela signifie-t-il le 1er juin ou le 6 janvier ?)
Si le format de représentation de la date n'est pas précisé, c'est difficile à gérer .

Pour comprendre la différence entre "18Jan1973" et "6Sep1950", vous devez les convertir en représentations numériques
Unix utilise les secondes d'époque en interne pour représenter le temps.
La somme de la date et de l'heure représente :
Le nombre de secondes entre minuit (époque) le 1er janvier 1970 GMT et l'instant actuel.
Par exemple, "18 janvier 1973 : la seconde d'époque (supposée être minuit) est 96163200.

2. Dans ce système, minuit représente le début de la journée.

Générons une date via la fonction gmtime fournie en Perl
Étant donné un entier représentant le nombre de secondes depuis l'époque, la date et l'heure correspondantes peuvent être calculées via la fonction gmtime,
Exemple. 1 :
Appelez la fonction gmtime() et vous obtiendrez une liste de valeurs, notamment les heures, les minutes, les secondes, les dates, les mois, les années, etc.


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

$t_num = 96163200;
$tm = scalar(gmtime($t_num));
print $tm,"\n";
Copier après la connexion

Sortie :
Jeudi 18 janvier 00:00:00 1973

Exemple 2 : Utilisez "," comme délimiteur pour afficher l'heure
print join(",", gmtime(96163200));

0, 0,0,18,0,73,4,17,0
Sémantique :
Les trois premiers nombres : 0,0,0 représentent respectivement les secondes, les minutes et les heures. Les heures vont de 0 à. 23, donc l'après-midi est après 12 heures
Le 4ème chiffre : 18, représente le nombre de jours dans le mois (dans ce cas, le 18
Le 5ème chiffre : 0, représente le mois, à partir de 0 (représentant le nombre de jours dans le mois de janvier).
commence à 0 car le mois correspond à l'indice du tableau mois :


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

Le 6ème chiffre : La représentation de 73, année, (73 dans ce cas) est un peu particulière. Il ne représente pas les deux derniers chiffres de l'année
Pourquoi est-il représenté de cette façon ?
C'est parce que le langage C le gère de cette façon.
Perl essaie de rendre ses bibliothèques et ses appels système aussi proches que possible de la façon dont le système d'exploitation les gère.
Donc, si vous souhaitez afficher un 4. -année à chiffres, elle s'exprime comme suit :

$year=(gmtime(96163200))[5]+1900;

Si vous ne comprenez pas cette méthode de traitement, cela créera des doutes sur l'an 2000. Vous pourriez écrire comme ceci :

$year=. "19".(gmtime(96163200))[5] ; #Erreur ! L'année 2000 deviendra 19100
Le 7ème chiffre : 4, indiquant le jour de la semaine (dimanche est 0).
Le 8ème chiffre : 17, le jour de l'année Jour (0 signifie le premier jour de l'année).
Le neuvième chiffre : 0, si l'heure d'été peut être adoptée (0 signifie ne pas l'utiliser, un nombre positif signifie utiliser cela, un nombre négatif signifie qu'il est inconnu).

3. La fonction time() en Perl renvoie la date et l'heure actuelles en secondes d'époque

Si vous prévoyez pour le convertir en chaîne, vous pouvez utiliser gmtime(. ) et la fonction localtime() :



$now=localtime(time());
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());
Copier après la connexion
If localtime() ou gmtime() est appelé sans paramètres, il appellera time() lui-même



$now=localtime();
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime();
Copier après la connexion

Fonction de traitement du temps Perl (opérations de date et d'heure) <🎜. >

1. Pour calculer la période de temps entre deux instants,

convertissez-les simplement en secondes d'époque correspondantes et soustrayez les deux nombres : $difference_in_seconds=$later_datetime- $earlier_datetime;

Pour convertir les secondes en minutes, heures ou jours, divisez-les simplement par 60, 3600 et 86400 respectivement :



2. Calculez "Quelle est la date dans 4 jours ?" :
$difference_in_minutes=$difference_in_seconds/60;
$difference_in_hours=$difference_in_seconds/3600;
$difference_in_day=$difference_in_seconds/86400;
Copier après la connexion



La réponse qu'elle donne est précise à la seconde près.
$then=time()+86400*4;
print scalar(localtime($then));
Copier après la connexion
Par exemple,

Si la valeur de la seconde époque 4 jours plus tard est 932836935, vous pouvez afficher la chaîne de date comme suit
Samedi 24 juillet 11:23:17 1999

3. Affichez l'heure de minuit d'une certaine date

telle que "Sam Jul 24 00:00:00 1999", utilisez le module suivant :
$then=$then-$then% 86400;#Supprimer la queue de la date

De même, vous pouvez utiliser l'arrondi pour afficher la date la plus proche de minuit :



Si votre Cela fonctionne si le fuseau horaire est à un nombre pair d'heures éloigné de GMT.
$then += 43200; #add on half a day
$then = $then - $then%86400; #truncate to the day
Copier après la connexion
Tous les fuseaux horaires ne sont pas faciles à gérer.

Ce dont vous avez vraiment besoin, c'est de calculer les secondes d'époque dans votre propre fuseau horaire, pas en GMT.

Un module nommé Time::Local en Perl,

peut fournir deux fonctions timelocal() et timegm(). Sa valeur de retour est la même que celle de localtime() et gmtime().



use Time::Local;
$then = time() + 4*86400;
$then = timegm(localtime($then)); #local epoch seconds
$then -= $then%86400; #truncate to the day
$then = timelocal(gmtime($then)); #back to gmt epoch seconds
print scalar(localtime$then,“\n”。
Copier après la connexion
3. Représentation des dates et heures utilisées dans la vie quotidienne dans les fonctions de traitement du temps Perl

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

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";
Copier après la connexion

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


useDate::Manip;
$epoch_seconds=UnixDate("19 Dec 1997 15:30:02","s");
Copier après la connexion

留心,由于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
Copier après la connexion

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


print scalar(gmtime(2**31-1)),"\n";
Tue Jan 19 03:14:07 2038
Copier après la connexion

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


print scalar(gmtime(2**31)),"\n";
Fri Dec 13 20:45:52 1901
Copier après la connexion

对于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模块。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal