Date et heure


Pour saisir l'instant présent (maintenant) ou pour dater des fichiers. Pour cela Perl met plusieurs fonctions et instructions à cet effet. Voyons les plus pratiques pour ne dépendre que de Perl et non pas du système ou l'on ce trouve (Linux, Windows, Etc...) aussi pour que votre script  formate les dates et l'heure comme bon vous semble et non pas comme il a l'habitude de vous les servir.

time, localtime et stat suffirons pour votre bonheur, d'à partir de là tout est possible (et en plus, c'est fastoche).
------------------------
En gros, sachez que: (nous verrons le détail au fil de cet article de vulgarisation)
- le 8 éme élément qui donne le nombre de secondes écoulées de l'origine (1/01/1970) au dernier accés par un utilisateur.
- le 9 éme élément qui donne aussi le nombre de sec écoulées depuis l'origine jusqu'à la dernière modification par un utilisateur.
- le 10 éme élément qui donne également un gros chiffre représentant le nombre de sec écoulées d'epoch au changement d'inode.

Donc grace à localtime on peut tranformer le paquet de secondes ( time) qui représente maintenant, en une date et heure comme on le souhaite.
Et aussi, transformer le paquet de secondes écoulées entre l'origine et le dernier acces à $file par stat qui s'écrit comme ceci (stat($file))[8] , en
une date et heure formater selon notre souhait.
Nous allons plus avant, voir quelques façons de faire avec localtime time et stat. (ça à l'air compliqué mais ça ne l'est pas)
Il ne faut pas perdre de vu que time et stat retourne un chiffre de l'ordre de 1272119599 (qui est le nombre de sec écouler depuis l'origine jusqu'au sam 24 avril 2010 à 16h35) et que quand il affichera 1 300 000 000 on sera le dimanche 13 mars 2011.
Et que c'est localtime qui nous indiquera, ce à quoi corespond ces gros chiffres, en le décomposant en 9 éléments représentant la date et l'heure.
Car on peut choisir quel champ apparaitra dans notre datation, exemple: Lundi 28 Fevrier 2010 -10h20  ou  2010-02-28|10:20:32 ou T6sZ



localtime EXPR


Convertit une date (chiffrée en sec) en un tableau de 9 éléments qui donneront la date dans votre fuseau horaire(local), comme suit:
#  0    1    2      3      4      5      6      7      8
($sec,$min,$heure,$mjour,$mois,$annee,$sjour,$ajour,$isdst) =  localtime(time);


donc :

champ
exp var
description
0
$sec
nombre de secondes écoulé dans la minute
1
$min
nombre de minutes écoulé dans l'heure
2
$heure
nombre d'heures écoulé dans la journée
3
$mjour
nombre de jour écoulé dans le mois
4
$mois
nombre de mois écoulé dans l'année ( 0 pour Janvier et 11 pour Décembre)
5
$année
nombre d'années écoulé depuis 1900 (donc pour avoir l'année effective $année +=1900)
si par contre on désire afficher la date style 02 ($année = sprintf("%02d", $année % 100);)
6
$sjour
nombre de jours écoulé dans la semaine (Dim étant le jour 0 et Lundi le jour 1)
7
$ajour
nombre de jour écoulé dans l'année
8
$isdst
est vrai si l'heure d'été est en cours à la date spécifié et faux sinon.

Exemple : pour afficher la date du dernier accès en français au fichier foo.log:
my $file = "./foo.log";
my $der_acces = (stat($file))[8];

($sec,$min,$heure,$mjour,$mois,$annee,$sjour,$ajour,$isdst) =  localtime($der_acces);
my @sjour = qw( Dim Lun Mar Mer Jeu Ven Sam);
my @smois = qw ( Janvier Février Mars Avril Mai Juin Juillet Aout Septembre Octobre Novembre Décembre );
my $date_dac = "
$sjour[$sjour] $mjour $smois[$mois] " . $année += 1900 . " - $heure:$min:$sec";
print "$date_dac\n";

> Lun 5 Avril 2010 - 17:51:23

Voilà on peut faire en sorte de ce servir d'un module de date heure comme FrenchDate.pm qui me fait tout ça et sort les formats de date et heure sous 28 forme différentes du plus courant au plus concentré en hexadécimal sur 5 caractère (pour inclure dans les noms de fichier) style : FvT5s   # qui est classé par année, mois, jour, heure, min,sec donc triable chronologiquement par date, exp : FdK8m-note.log.
Mais vous pouvez vous passer de DateFrench et faire une routine, style:
sub der_acces($file) {
    my $file=@_;

        my $der_acces = (stat($file))[8];
    ($sec,$min,$heure,$mjour,$mois,$annee,$sjour,$ajour,$isdst) =  localtime($der_acces);
    my @sjour = qw( Dim Lun Mar Mer Jeu Ven Sam);
    my @smois = qw ( Janvier Février Mars Avril Mai Juin Juillet Aout Septembre Octobre Novembre Décembre );
    my $date_dac = "
$sjour[$sjour] $mjour $smois[$mois] " . $année += 1900 . " - $heure:$min:$sec";
    return $$date_dac;
}



Ou encore mieux en quelques lignes, il vous donnera la date et l'heure de l'instant présent ainsi que la date et l'heure du dernier accès ou de
la dernière modification ou changement:

# traitement du temps pour date et heure en français
(my $sec,my $min,my $heure,my $mjour,my $mois,my $annee,my $sjour,my $ajour,my $isdst) =  localtime(time);
my @lssjour = qw( Dim Lun Mar Mer Jeu Ven Sam);
my @lssmois = qw ( Janvier Fevrier Mars Avril Mai Juin Juillet Aout Septembre Octobre Novembre Decembre );
# $french_date_now vous donne la date et l'heure de l'instant présent
my $french_date_now = "$lssjour[$sjour] $mjour $lssmois[$mois] " . ($annee+=1900) . " - $heure:$min:$sec";

#remplacer "./lisezmoi" par le nom complet du fichier que vous désirez dater
my $file = "./lisezmoi";
my $mode = "acces";         # vous pouvez changer acces par change ou modif (a,c,m la premiere lettre suffit)
my $datenum = 0;
# voila le resultât (la date en français formater et l'heure) sont dans $fr_date_file
my $fr_date_file = &datefile($mode);
print "$fr_date_file\n";


sub datefile {
 
  ($mode = 8) if ($mode=~ /^a/);
  ($mode = 9) if ($mode=~ /^m/);
  ($mode = 10) if ($mode=~ /^c/);
  print "mode vaut : $mode\n";
  $datenum = ((stat($file))[$mode]);
  print "$datenum\n";
  (my $sec,my $min,my $heure,my $mjour,my $mois,my $annee,my $sjour,my $ajour,my $isdst) =  (localtime($datenum));
  my $fr_date_file = "$lssjour[$sjour] $mjour $lssmois[$mois] " . ($annee+=1900) . " - $heure:$min:$sec";
  return $fr_date_file;
}


Bien évidement vous pouvez adapter le formatage pour vous faire un format sur mesure, style; tout en chiffre ou hexadecimal ...
Si vous séchez regarder sur mon module DateFrench, ça vous donnera des idées.  J'arrive à faire sortir une date/heure sur 4 caractères,
comprenant l'année, le mois, le jour, l'heure,les minutes, les secondes (dans cet ordre donc triable).