2010-12-14 28 views

Répondre

5

J'utiliser Date::Calc. Supposons que vos deux horodatages sont situés dans $ts1 et $ts2:

use Date::Calc qw(Time_to_Date Date_to_Time Delta_Days Add_Delta_Days); 

my @date1 = (Time_to_Date($ts1))[0..2]; 
my @date2 = (Time_to_Date($ts2))[0..2]; 
my @midnights; 

for (my $i = 0; $i < Delta_Days(@date1, @date2); ++$i) { 
    push @midnights, Date_to_Time(Add_Delta_Days(@date1, $i), 23, 59, 59); 
} 

@midnights contient maintenant le point (s) UNIX (horodatages secondes d'époque) de tous 23:59:59 entre les deux horodatages données.

Avertissement: Bien sûr, vous pouvez aussi le faire avec DateTime.

+0

Merci, c'est ce dont j'ai besoin! – VeroLom

2

C'est un algorithme générique. X est le 1er horodatage Y est le dernier

1) Obtenez la première date de modification, Z.

If Z > Y , there is no change. 

2) Obtenez la dernière date de modification, W

If W = Z, there is only one change date. 

3) Get la plage de dates, R. Compte tenu de la gamme d'un jour est D

R = W - Z .. The number of points will be the integer of (W - Z)/D 
1

Voici un exemple que je mis au rebut ensemble en fonction de mon semi-récente connaissance de l'horodatage UNIX (l'école est il y a si longtemps ...)

while (entry) { 
    if ((timestamp-1) % 86400 == 0) { 
     #match 
    } else { 
     #nomatch 
    } 
} 

Cependant, comme tout le monde, je suggère d'utiliser d'autres outils pour le faire puisque mon exemple ne prend pas en compte les secondes intercalaires et je doute fort qu'il soit conforme à POSIX. Plus d'info here.