%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.5pour 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).