Aller au contenu

%SECONDS

Durée en secondes

Représente un nombre de secondes, à ajouter à une heure ou à un horodatage, ou à en retrancher.

Syntaxe

heure + %SECONDS(nombre)
horodatage - %SECONDS(nombre)
nombre
Le nombre de secondes : une constante, une zone numérique ou une expression. Sur un horodatage, il peut avoir des décimales (1.5 pour une seconde et demie).
Résultat
Une durée, à combiner avec une heure ou un horodatage par + ou -. Le compilateur refuse la durée avec une date (RNF7584).

À quoi ça sert

Beaucoup de systèmes donnent un temps en secondes : durée d'un appel, âge d'une session, délai d'expiration. %SECONDS les convertit en heure lisible ou en instant précis, sans division par 3600.

Exemple 1 : Conversion et expiration

**free
// %SECONDS : ajouter des secondes, ou convertir un nombre de secondes en heure.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s zero    time inz(t'00.00.00');
dcl-s session timestamp inz(z'2026-09-30-23.59.30.000000');
dcl-s secondes int(10) inz(45296);

// 45 296 secondes ecoulees depuis minuit : quelle heure ?
snd-msg 'Depuis minuit      : [' + %char(zero + %seconds(secondes) : *hms) + ']';

// Expiration d'une session au bout de 60 secondes : la date change.
snd-msg 'Session ouverte    : [' + %char(session) + ']';
snd-msg 'Expire a           : [' + %char(session + %seconds(60)) + ']';

// Les secondes peuvent etre decimales sur un horodatage.
snd-msg 'Session + 1,5 s    : [' + %char(session + %seconds(1.5)) + ']';

// Un delai d'un jour en secondes.
snd-msg 'Session + 86 400 s : [' + %char(session + %seconds(86400)) + ']';

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Depuis minuit      : [12:34:56]
Session ouverte    : [2026-09-30-23.59.30.000000]
Expire a           : [2026-10-01-00.00.30.000000]
Session + 1,5 s    : [2026-09-30-23.59.31.500000]
Session + 86 400 s : [2026-10-01-23.59.30.000000]

45 296 secondes après minuit : 12:34:56. Une session ouverte à 23:59:30 expire 60 secondes plus tard le lendemain à 00:00:30. Sur un horodatage, on peut ajouter une seconde et demie. Un jour entier fait 86 400 secondes.

Exemple 2 : Au-delà de 24 heures

**free
// %SECONDS : sur une heure, tout ce qui depasse 24 h est perdu.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s zero time inz(t'00.00.00');
dcl-s jeton timestamp inz(z'2026-09-30-00.00.00.000000');

snd-msg '3 601 s     : [' + %char(zero + %seconds(3601) : *hms) + ']';
snd-msg '86 399 s    : [' + %char(zero + %seconds(86399) : *hms) + ']';
snd-msg '86 400 s    : [' + %char(zero + %seconds(86400) : *hms) + ']';
snd-msg '90 000 s    : [' + %char(zero + %seconds(90000) : *hms) + ']';

// Pour garder le jour, il faut travailler sur un horodatage.
snd-msg '90 000 s (T): [' + %char(jeton + %seconds(90000)) + ']';

// Une soustraction sous zero repasse par 23 h 59.
snd-msg 'zero - 1 s   : [' + %char(zero - %seconds(1) : *hms) + ']';

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

3 601 s     : [01:00:01]
86 399 s    : [23:59:59]
86 400 s    : [00:00:00]
90 000 s    : [01:00:00]
90 000 s (T): [2026-10-01-01.00.00.000000]
zero - 1 s   : [23:59:59]

Sur une zone heure, 86 399 secondes donnent 23:59:59, 86 400 donnent 00:00:00 et 90 000 donnent 01:00:00 : tout ce qui dépasse une journée est perdu. Avec un horodatage, on retrouve le lendemain à 01:00:00. Retrancher une seconde à minuit donne 23:59:59.

Le piège

Sur une zone de type heure, un total supérieur à 86 400 secondes reboucle sans erreur. 90 000 secondes donnent 01:00:00 et non « 25 h ». Pour une durée qui peut dépasser un jour, utiliser un horodatage et ne pas repasser par une heure.

Comme les autres durées courtes, %SECONDS est refusé avec une date (RNF7584).