Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

différence entre deux dates pb de min

9 réponses
Avatar
Alexandre Jaquet
Hello,

J utilise le bout de code suivant pour obtenir la différence en jour /
heure / minute

my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2 =>
'2004-04-28 15:38:31' );

print $timeDiffStr ;

sub timeDiff (%) {
my %args = @_;

my @offset_days = qw(0 31 59 90 120 151 181 212 243 273 304 334);

my $year1 = substr($args{'date1'}, 0, 4);
my $month1 = substr($args{'date1'}, 5, 2);
my $day1 = substr($args{'date1'}, 8, 2);
my $hh1 = substr($args{'date1'},11, 2) || 0;
my $mm1 = substr($args{'date1'},14, 2) || 0;
my $ss1 = substr($args{'date1'},17, 2) if (length($args{'date1'}) > 16);
$ss1 ||= 0;

my $year2 = substr($args{'date2'}, 0, 4);
my $month2 = substr($args{'date2'}, 5, 2);
my $day2 = substr($args{'date2'}, 8, 2);
my $hh2 = substr($args{'date2'},11, 2) || 0;
my $mm2 = substr($args{'date2'},14, 2) || 0;
my $ss2 = substr($args{'date2'},17, 2) if (length($args{'date2'}) > 16);
$ss2 ||= 0;

my $total_days1 = $offset_days[$month1 - 1] + $day1 + 365 * $year1;
my $total_days2 = $offset_days[$month2 - 1] + $day2 + 365 * $year2;
my $days_diff = $total_days2 - $total_days1;

my $seconds1 = $total_days1 * 86400 + $hh1 * 3600 + $mm1 * 60 + $ss1;
my $seconds2 = $total_days2 * 86400 + $hh2 * 3600 + $mm2 * 60 + $ss2;

my $ssDiff = $seconds2 - $seconds1;

my $dd = int($ssDiff / 86400);
my $hh = int($ssDiff / 3600) - $dd * 24;
my $mm = int($ssDiff / 60) - $dd * 1440 - $hh * 60;
my $ss = int($ssDiff / 1) - $dd * 86400 - $hh * 3600 - $mm * 60;

"$dd Tage $hh Std. $mm Min. $ss sec";
}

le probleme lorsque je l execute sous mod_perl est que le calcul n'est
pas effectuè plusieurs fois

j ai placé chacune de me variables en local our mais cela ne change rien

sub timeDiff (%) {
local our %args = @_;

local our @offset_days = qw(0 31 59 90 120 151 181 212 243 273 304 334);

local our $year1 = substr($args{'date1'}, 0, 4);
local our $month1 = substr($args{'date1'}, 5, 2);
local our $day1 = substr($args{'date1'}, 8, 2);
local our $hh1 = substr($args{'date1'},11, 2) || 0;
local our $mm1 = substr($args{'date1'},14, 2) || 0;
local our $ss1 = substr($args{'date1'},17, 2) if
(length($args{'date1'}) > 16);
$ss1 ||= 0;

local our $year2 = substr($args{'date2'}, 0, 4);
local our $month2 = substr($args{'date2'}, 5, 2);
local our $day2 = substr($args{'date2'}, 8, 2);
local our $hh2 = substr($args{'date2'},11, 2) || 0;
local our $mm2 = substr($args{'date2'},14, 2) || 0;
local our $ss2 = substr($args{'date2'},17, 2) if
(length($args{'date2'}) > 16);
$ss2 ||= 0;

local our $total_days1 = $offset_days[$month1 - 1] + $day1 + 365 * $year1;
local our $total_days2 = $offset_days[$month2 - 1] + $day2 + 365 * $year2;
local our $days_diff = $total_days2 - $total_days1;

local our $seconds1 = $total_days1 * 86400 + $hh1 * 3600 + $mm1 * 60 +
$ss1;
local our $seconds2 = $total_days2 * 86400 + $hh2 * 3600 + $mm2 * 60 +
$ss2;

local our $ssDiff = $seconds2 - $seconds1;

local our $dd = int($ssDiff / 86400);
local our $hh = int($ssDiff / 3600) - $dd * 24;
local our $mm = int($ssDiff / 60) - $dd * 1440 - $hh * 60;
local our $ss = int($ssDiff / 1) - $dd * 86400 - $hh * 3600 -
$mm * 60;

return "$dd Jour $hh Heures. $mm Min";
}


si quelqu un voit de quoi ca peut venir

exemple du code en execution :

http://supermarket.no-ip.biz/cgi-bin/recordz.cgi?lang=fr&session=b43b511cbc0b87570573806ad4f33ef9&action=detailother&article=42590

9 réponses

Avatar
Jacques Caron
Salut,

On Mon, 01 Aug 2005 23:22:04 +0200, wrote:

J utilise le bout de code suivant pour obtenir la différence en jour /
heure / minute

my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2 =>
'2004-04-28 15:38:31' );


Urg... Et manipuler des dates au format Unix (secondes depuis le
1/1/1970), ce serait pas plus propre?

le probleme lorsque je l execute sous mod_perl est que le calcul n'est
pas effectuè plusieurs fois

j ai placé chacune de me variables en local our mais cela ne change rien


Les variables en my dans la sub ne devraient poser aucun problème, c'est
plutôt au niveau de l'appel que doit se situer le problème... Fais un
print STDERR de tes deux dates avant l'appel, à mon avis tu verras que ce
sont bien les dates fournies qui ne changent pas...

Jacques.

Avatar
Alexandre Jaquet
Salut,

On Mon, 01 Aug 2005 23:22:04 +0200, wrote:

J utilise le bout de code suivant pour obtenir la différence en jour
/ heure / minute

my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2
=> '2004-04-28 15:38:31' );



Urg... Et manipuler des dates au format Unix (secondes depuis le
1/1/1970), ce serait pas plus propre?

le probleme lorsque je l execute sous mod_perl est que le calcul
n'est pas effectuè plusieurs fois

j ai placé chacune de me variables en local our mais cela ne change rien



Les variables en my dans la sub ne devraient poser aucun problème,
c'est plutôt au niveau de l'appel que doit se situer le problème...
Fais un print STDERR de tes deux dates avant l'appel, à mon avis tu
verras que ce sont bien les dates fournies qui ne changent pas...

Jacques.


c est ce que je test j affiche dans la page web les parametres passé en
valeurs (si tu refresh tu vois bien la diff)

l appel ce passe comme ceci :

local our ($enchere_time_end)=sqlSelect("enchere_date_fin ", "article",
"id_article = '$article'");
local our
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
local our $date = sprintf "%4d-%02d-%02d",$year+1900,$mon+1,$mday;
local our $time = sprintf("%4d:%02d:%02d",$hour,$min,$sec);
print "Content-type: text/htmlnn";
print "enchere duration rest between :$date $time and
$enchere_time_end<br/>";
$enchere_duration_rest = "";
$enchere_duration_rest = timeDiff( date1 => "$enchere_time_end", date2
=> "$date $time" );
print "$enchere_duration_rest<br/>";


Avatar
Alexandre Jaquet

Salut,

On Mon, 01 Aug 2005 23:22:04 +0200, wrote:

J utilise le bout de code suivant pour obtenir la différence en jour
/ heure / minute

my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2
=> '2004-04-28 15:38:31' );




Urg... Et manipuler des dates au format Unix (secondes depuis le
1/1/1970), ce serait pas plus propre?

le probleme lorsque je l execute sous mod_perl est que le calcul
n'est pas effectuè plusieurs fois

j ai placé chacune de me variables en local our mais cela ne change rien




Les variables en my dans la sub ne devraient poser aucun problème,
c'est plutôt au niveau de l'appel que doit se situer le problème...
Fais un print STDERR de tes deux dates avant l'appel, à mon avis tu
verras que ce sont bien les dates fournies qui ne changent pas...

Jacques.



c est ce que je test j affiche dans la page web les parametres passé en
valeurs (si tu refresh tu vois bien la diff)

l appel ce passe comme ceci :

local our ($enchere_time_end)=sqlSelect("enchere_date_fin ", "article",
"id_article = '$article'");
local our
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
local our $date = sprintf "%4d-%02d-%02d",$year+1900,$mon+1,$mday;
local our $time = sprintf("%4d:%02d:%02d",$hour,$min,$sec);
print "Content-type: text/htmlnn";
print "enchere duration rest between :$date $time and
$enchere_time_end<br/>";
$enchere_duration_rest = "";
$enchere_duration_rest = timeDiff( date1 => "$enchere_time_end", date2
=> "$date $time" );
print "$enchere_duration_rest<br/>";



Alors en testant ligne par ligne et en affichant les valeurs récues j ai
constaté un pb du au formatage

finalement en utilisant de la manière suivante cela marche nickel :

local our ($enchere_time_end)=sqlSelect(" enchere_date_fin ",
"article", "id_article = '$article'");
local our
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
my ($y, $m, $d, $hh, $mm, $ss) = (localtime)[5,4,3,2,1,0]; $y +=
1900; $m++;
my $iso_now = sprintf("%d-%02d-%02d %02d:%02d:%02d", $y, $m, $d,
$hh, $mm, $ss);
$enchere_duration_rest = timeDiff("$enchere_time_end","$iso_now"
);



Avatar
Patrick Mevzek
my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2 =>
'2004-04-28 15:38:31' );


Urg... Et manipuler des dates au format Unix (secondes depuis le
1/1/1970), ce serait pas plus propre?


Ou un module dédié style DateTime qui encapsule tout cela, et fournit
tous les outils nécessaire pour additionner, soustraire, comparer, etc...

La manipulation des dates, c'est vraiment un cas typique où il faut
éviter de réinventer la roue parce qu'il existe déjà tout ce qu'il
faut, et qu'on va nécessairement oublier des choses (gestion correcte des
fuseaux horaires, années bissextiles, leap seconds, etc...)

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>


Avatar
Alexandre Jaquet

my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2 =>
'2004-04-28 15:38:31' );


Urg... Et manipuler des dates au format Unix (secondes depuis le
1/1/1970), ce serait pas plus propre?



Ou un module dédié style DateTime qui encapsule tout cela, et fournit
tous les outils nécessaire pour additionner, soustraire, comparer, etc...

La manipulation des dates, c'est vraiment un cas typique où il faut
éviter de réinventer la roue parce qu'il existe déjà tout ce qu'il
faut, et qu'on va nécessairement oublier des choses (gestion correcte des
fuseaux horaires, années bissextiles, leap seconds, etc...)



tout à fait d'accord mais la documentation relative à ces modules n'est
pas souvent de qualité, mais je comprend tout à fait qu'il faut trouvé
des personnes qui ont le temps

et ils nous saoulent avec leur anglais :))



Avatar
Klaus
"Alexandre Jaquet" <""alexjaquet"@[no spam]msn.com"> wrote in message
news:42eec4b2$0$1164$

my $timeDiffStr = &timeDiff( date1 => '2004-04-28 15:36:30', date2 =>
'2004-04-28 15:38:31' );


Urg... Et manipuler des dates au format Unix (secondes depuis le
1/1/1970), ce serait pas plus propre?



Ou un module dédié style DateTime qui encapsule tout cela, et fournit
tous les outils nécessaire pour additionner, soustraire, comparer,
etc...



La manipulation des dates, c'est vraiment un cas typique où il faut
éviter de réinventer la roue parce qu'il existe déjà tout ce qu'il
faut, et qu'on va nécessairement oublier des choses (gestion correcte
des


fuseaux horaires, années bissextiles, leap seconds, etc...)



tout à fait d'accord mais la documentation relative à ces modules n'est
pas souvent de qualité


Une simple recherche "datetime perl" sous google me donne comme *premier*
résultat: http://datetime.perl.org/ --> cette documentation est de très
bonne qualité.

mais je comprend tout à fait qu'il faut trouvé
des personnes qui ont le temps.


Je vous propose de faire une demande sur le forum "perl.jobs", voir
http://groups.google.fr/group/perl.jobs

et ils nous saoulent avec leur anglais :))


Je comprends bien que 99% de la documentation Perl est en anglais, mais la
documentation en français existe sur internet et si vous utilisez google,
vous la trouverez rapidement.

Une recherche "datetime perl français" sous google me donne sur la première
page (sixième résultat): http://datetime.mongueurs.net/Perl/ --> cette
documentation est une traduction française d'une partie de la documentation
des modules datetime. Ce n'est pas complet, mais il y a quand même pas mal
de doc:

- La FAQ est traduite
- DateTime : module de base pour le calendrier grégorien
- DateTime::Duration : classe permettant de représenter la différence entre
deux dates-heures
- DateTime::Infinite : dates infinies, passées ou futures
- DateTime::LeapSecond : ajustement du temps UTC
- DateTime::TimeZone : classe décrivant les fuseaux horaires
- DateTime::Locale : classe gérant les données de localisation
- DateTime::Locale::Base : classe contenant les données linguistiques et
locales
- DateTime::Set : classe permettant de définir des ensembles de dates
- DateTime::Span : classe permettant de définir des plages de dates,
début--fin
- DateTime::SpanSet : classe permettant de définir des ensembles de plages
de dates
- DateTime::Calendar::Julian : calendrier julien, l'ancêtre du calendrier
grégorien
- DateTime::Calendar::Christian : réunit le calendrier julien et le
calendrier grégorien, en fonction de la date de réforme
- DateTime::Calendar::Hebrew : calendrier hébraïque
- DateTime::Calendar::Hijri : calendrier de l'Hégire
- DateTime::Calendar::Mayan : calendrier maya
- DateTime::Calendar::FrenchRevolutionary : calendrier républicain
- DateTime::Calendar::Pataphysical : calendrier 'pataphysique
- DateTime::Fiction::JRRTolkien::Shire : calendrier hobbit
- DateTime::Format::ICal : date conforme à la RFC 2445
- DateTime::Format::Roman : date sous la forme utilisée par les Romains
- DateTime::Format::Strptime : permet de convertir une chaîne de caractères
en date-heure

--
Klaus




Avatar
Patrick Mevzek
et ils nous saoulent avec leur anglais :))


Outre l'existence de traductions, comme l'a signalé Klaus, je pense que
ce forum peut vous aider si vous avez des questions précises sur l'usage
de tel ou tel module, et vous allez vraiment y gagner (c'est un bon
investissement) que de passer du temps à apprendre à utiliser un module
tel DateTime, plutôt que de refaire grosso modo la même chose et de
débuguer.

Pour votre problème précis, si vous avez deux dates sous forme d'objets
DateTime, vous pouvez faire directement la différence et vous obtenez un
objet DateTime::Duration

Après quoi les méthodes in_units et delta_* vous permettront d'avoir
tous les détails nécessaires.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
Alexandre Jaquet

et ils nous saoulent avec leur anglais :))



Outre l'existence de traductions, comme l'a signalé Klaus, je pense que
ce forum peut vous aider si vous avez des questions précises sur l'usage
de tel ou tel module, et vous allez vraiment y gagner (c'est un bon
investissement) que de passer du temps à apprendre à utiliser un module
tel DateTime, plutôt que de refaire grosso modo la même chose et de
débuguer.

Pour votre problème précis, si vous avez deux dates sous forme d'objets
DateTime, vous pouvez faire directement la différence et vous obtenez un
objet DateTime::Duration

Après quoi les méthodes in_units et delta_* vous permettront d'avoir
tous les détails nécessaires.

Merci de vos conseils, je suis entrain de consulter la doc sur

DateTime::Duration et j'aimerais pouvoir créer deux objets
DateTime::Duration a partir de deux dates.

DateTime::Duration->new($date_from_db, $now) je ne trouve pas comment je
peux le faire.

D'avance merci


Avatar
Patrick Mevzek
Merci de vos conseils, je suis entrain de consulter la doc sur
DateTime::Duration et j'aimerais pouvoir créer deux objets
DateTime::Duration a partir de deux dates.


Dit tel quel, je ne suis pas sur que cela ait un sens, ou je ne suis pas
sûr de comprendre ce que vous voulez faire, étant donné qu'une date est
un point dans le temps, et que DateTime::Duration s'occupe de durées.

DateTime::Duration->new($date_from_db, $now)


Vous ne pouvez pas faire cela, en tout cas comme cela.

je ne trouve pas comment je peux le faire.


Et que voulez-vous faire ?
Si vous avez deux dates, il suffit de créer deux objets DateTime
(DateTime et pas DateTime::Duration) et une simple soustraction vous
créera un objet DateTime::Duration qui représente la durée entre les
deux dates.

Si c'est au niveau de la création des objets DateTime que ca bloque, il y
a plusieurs façons de faire selon vos données de départ.
Le module DateTime::Format::ISO8601 risque de vous être très utile pour
parser une date sous forme de chaine de caractères et créer un objet
DateTime.


--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>