TIMECALC

Section: User Commands (1)

NOM

timecalc - effectuer des calculs de dates et de dur�s.

SYNOPSYS

timecalc [-c] [-d # ] [-e expr ] [-f file ] [-h] [-i format ] [-o format ] [-v] [-w]

DESCRIPTION

timecalc effectue des calculs de dates et de dur�s en combinant les deux types de donn�s.

Sauf mention contraire, chaque fois qu'il est employ�dans ce document, le terme date doit s'entendre au sens *nix de la chose. C'est �dire un rep�e dans le temps, ayant comme point de d�art le premier janvier 1970 �z�o heure. Le temps est d�ompt��partir de ce rep�e seconde par seconde.

timecalc �alue des expressions contenant des dates, des dur�s, des nombres et des op�ateurs. Il produit en r�ultat, soit une nouvelle date, si l'expression contient au moins une date, soit une dur� si l'expression ne contient aucune date ou si l'expression contient une soustraction entre deux dates.

Il y a trois possibilit� pour fournir les expressions a �aluer �timecalc : Soit sur l'entr� standard ; soit sur la ligne de commande, en les introduisant avec l'option -e et dans ce cas il est prudent de mettre l'expression entre apostrophes afin d'�iter l'interpr�ation des caract�es sp�iaux par le shell ; soit enfin, en �rivant les expressions dans un fichier et en demandant �timecalc de lire ce fichier avec l'option -f.

Les expressions que l'on fournit �timecalc doivent �re r�ig�s en respectant la grammaire suivante, d�rite �l'aide d'une notation BNF simplifi� :

r�ultat ::= date-calcul� [format-sortie] ;
                | nb-mois [format-sortie] ;
                | nb-secondes [format-sortie] ;

date-calcul� ::= date
                | date-calcul� + nb-mois
                | date-calcul� - nb-mois
                | date-calcul� + nb-secondes
                | date-calcul� - nb-secondes
                | ( date-calcul� )

nb-mois ::= mois
                | nb-mois + nb-mois
                | nb-mois - nb-mois
                | NOMBRE * nb-mois
                | nb-mois / NOMBRE 
                | ( nb-mois )

nb-secondes ::= secondes
                | nb-secondes + nb-secondes
                | nb-secondes - nb-secondes
                | NOMBRE * nb-secondes
                | nb-secondes / NOMBRE
                | date-calcul� - date-calcul�
                | ( nb-secondes )

date ::= NOW
                | CHAINE-DATE [format-entr�]

mois ::= NOMBRE MON
                | NOMBRE MONTH
                | NOMBRE YEAR

secondes ::= NOMBRE SEC
                | NOMBRE SECOND
                | NOMBRE MIN
                | NOMBRE MINUTE
                | NOMBRE HOUR
                | NOMBRE DAY
                | NOMBRE WEEK

format-sortie ::= [WITH] OUTPUT FORMAT CHAINE-DE-FORMAT

format-entr� ::= [WITH] INPUT FORMAT CHAINE-DE-FORMAT

Dans la grammaire d�rite ci-dessus, les mots en MAJUSCULE ainsi que les op�ateurs sont les ��ents terminaux du langage. Attention, cependant, les ��ents terminaux s'�rivent en minuscule.

Dans la grammaire d�rite ci dessus les ��ents entre crochets sont optionnels.

L'��ent terminal NOMBRE correspond aux nombres entr�. Il sagit d'entiers non sign�.

Les ��ents terminaux CHAINE-DATE et CHAINE-DE-FORMAT correspondent aux cha�es de caract�es entr�s. Les chaines s'�rivent entre guillemets.

les ��ents terminaux YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND peuvent s'�rire au pluriel.

les ��ents terminaux MON, MIN, SEC sont les abr�iations respectives de MONTH, MINUTE SECOND.

L'��ent terminal NOW correspond a la date syst�e.

FORMATAGE DES DATES EN SORTIE.
Le format de sortie des dates est par d�aut le format d�ini par l'ISO. C'est �dire : Jour Mois quanti�e heure : minutes : secondes si�le ann�. Il correspond �l'utilisation de l'indicateur de conversion %c de la fonction strftime(3) (Voir ci dessous les liens qui unissent timecalc �strftime(3) )

Il est possible de modifier le format de sortie des dates de deux fa�ns : soit globalement, soit expression par expression.

La modification globale du format de sortie des dates s'obtient avec l'option -o suivie d'une cha�e de format. La cha�e de format doit dans ce cas commencer par l'identifiant datef=

La modification du format de sortie des dates expression par expression, s'obtient en ajoutant la phrase [with] output format chaine_de_format apr� l'expression (le mot with est optionnel).

Que ce soit celles que l'on fournit via l'option -o ou celles que l'on fournit expression par expression, les cha�es de format de date sont compos�s �l'aide des m�es indicateurs de conversion que ceux que l'on fournit �la fonction strftime(3). Par exemple, "%d%m%y" correspond �jour/mois/ann� (2 chiffres). Reportez vous �la page de manuel de strftime(3) pour obtenir tout les d�ails sur les possibilit� de formatage.


FORMATAGE DES DUR�S EN SORTIE.
Le format de sortie des dur�s par d�aut est le suivant : "<nombre de jours> days <nombre d'heures> hours <nombre de minutes> minutes <nombre de secondes> seconds". Comme pour les dates, il est �alement possible de modifier le format de sortie des dur�s de deux fa�ns : soit globalement, soit expression par expression.

La modification globale du format de sortie des dur�s s'obtient comme pour le formatage des dates, avec l'option -o. Dans ce cas la cha�e de format doit commencer, soit par l'identifiant durationf= , soit par l'identifiant fuzzyf=

l'identifiant durationf= permet de d�inir la chaine de format destin� �l'affichage des dur�s pr�ises. Alors que l'identifiant fuzzyf= permet de d�inir la chaine de format destin� �l'affichage des dur�s floues (voir BOGUES pour une explication de la diff�ence entre ces deux types de dur�s).

La modification du format de sortie des dur�s expression par expression, s'obtient comme pour les dates en ajoutant la phrase [with] output format chaine_de_format apr� l'expression (le mot with est optionnel).

Que ce soit celles que l'on fournit via l'option -o ou celles que l'on fournit expression par expression, les cha�es de format de dur� sont compos�s �l'aide d'indicateurs de conversion semblables �ceux que l'on utilise pour les cha�es de format de date. Comme pour les cha�es de format de date, les indicateurs de conversion sont introduits par le caract�e `%' et sont remplac�, dans la sortie comme ceci :
%y
Le nombre d'ann�s du r�ultat (flou)
%m
Le nombre de mois du r�ultat (flou)
%W
Le nombre de semaines du r�ultat (pr�is)
%D
Le nombre de jours du r�ultat (pr�is)
%H
Le nombre d'heures du r�ultat (pr�is)
%M
Le nombre de minutes du r�ultat (pr�is)
%S
Le nombre de secondes du r�ultat (pr�is)


Par exemple, "%d %m" correspond �jour mois.

Attention ! Il n'est pas possible de m�anger des indicateurs de conversion produisant des valeurs floues et des indicateurs de conversion produisant des valeurs exactes dans la m�e cha�e de format. Si cela est fait, le r�ultat n'est simplement pas affich�


FORMATAGE DES DATES EN ENTR�.
Le format des dates en entr� est par d�aut : "ann�(4 chiffres)/mois/jour heure/minutes/secondes".

Comme pour les dates et les dur�s, il est possible de modifier le format d'entr� des dates de deux fa�ns : soit globalement, soit expression par expression.

La modification globale du format d'entr� s'obtient avec l'option -i.

La modification du format d'entr� des dates expression par expression, s'obtient en ajoutant la phrase [with] input format chaine_de_format apr� la chaine de date (le mot with est optionnel).

Que ce soit celles que l'on fournit via l'option -i ou celles que l'on fournit expression par expression, les cha�es de format d'entr� sont compos�s �l'aide d'indicateurs de conversion identiques �ceux que l'on utilise pour les cha�es de format de dur�. Comme pour les cha�es de format de dur�, les indicateurs de conversion sont introduits par le caract�e `%'. Chaque indicateur de conversion doit correspondre �une valeur dans la cha�e de date. Les autres caract�es tels que les `/' doivent correspondre caract�e pour caract�e dans la cha�e de date. Les indicateurs de conversion disponibles sont les suivants :
%y
L'ann� de la date sans le si�le.
%Y
L'ann� de la date avec le si�le.
%m
Le mois de la date
%d
Le jour de la date
%H
L'heure de la date
%M
Les minutes de la date
%S
Les secondes de la date


Si l'on d�ire utiliser un caract�e `%' dans le format d'entr� il suffit de le doubler (%%).

Par exemple, "%d/%m/%Y" accepte des dates compos�s du jour du mois et de l'ann� avec le si�le. Le tout s�ar�par des `/'.

Globalement, le comportement de timecalc avec les formats d'entr� est similaire au comportment de scanf(3)



INITIALISATION et COMPLETION
Les indicateurs de position absents du format d'entr� sont valoris� �z�o (ou 1 pour le mois)

Une ann� valoris� �z�o provoquera une erreur par d�assement de capacit�des routines de manipulation de date syst�e.

Si l'option -c est positionn� et si les indicateurs de conversion absents du format d'entr� sont : Soit tous les indicateurs d�rivant une date (au sens calendaire, cette fois, donc les indicateurs de jour, mois et ann�) Soit tous les indicateurs de conversion d�rivant une heure (donc les indicateurs d'heure, de minute et de seconde) ; Timecalc compl�e automatiquement les dates en entr� avec la valeur de la date ou de l'heure syst�e au moment de l'�aluation de l'expression.

Cette fontionnalit�permet de n'avoir �fournir que les ��ents utiles au calcul, tout en disposant d'une date exacte au moment du calcul.


L'ordre d'utilisation des diff�ents formats d'entr� et/ou de sortie est le suivant :

S'il existe, le format d�ini dans l'expression est utilis� Si celui-ci n'existe pas, alors, s'il existe, le format global introduit sur la ligne de commande par une option -o ou -i est utilis� Si ce dernier n'existe pas, alors le format par d�aut est utilis�

OPTIONS

-c
Autorise la compl�ion des dates en entr�.
-d #
D�ermine le niveau d'affichage de d�oguage. (Actuellement il n'y a qu'un niveau, le niveau 1).
-e expression
Evalue expression.
-f fichier
Evalue les expressions contenues dans fichier.
-h
Imprime une aide sommaire et quitte.
-i format
Utilise format pour accepter les dates en entr�.
-o format
Utilise format pour afficher les dates ou les dur�s selon l'identifiant de format. Il est tout a fait possible de mettre plusieurs options '-o' sur la ligne de commande pour fournir a timecalc les diff�ents formats de sortie : datef=, durationf= et fuzzyf=
-v
Imprime le num�o de version et quitte.
-w
Supprime l'affichage des messages d'avertissement.

EXEMPLES

timecalc -i "%Y/%m/%d" -e 'now ; "2000/2/2" + 24 hours; "2001/1/1" + 3 mon with output format "%d%m/%y" ;'

timecalc -e '"2003/6/27 17:00:00" + ("2003/9/2 09:00:00" - "2003/6/27 17:00:00")/2;'

DIAGNOSTICS

(FUZZY)
Il arrive que le calcul produise un r�ultat flou (Voir ci dessous). Dans ce cas pour indiquer que le resultat est flou, le message "(FUZZY)" est affich�apr� le r�ultat. Il est cependant possible de supprimer cet affichage avec l'option -w.


Day of month doesn't match (31/2). Altered (28/2)
est affich�si timecalc est amen��modifier le jour de la fin du mois suite �un calcul. Ces messages seront aussi supprim� par l'utilisation de l'option -w.

BOGUES & LIMITES



Calculs flous
S'il y a utilisation de valeurs irr�uli�es dans le calcul telles que les ann�s ou les mois, le calcul produit une valeur calendairement exacte mais arithm�iquement fausse. On consid�e que le r�ultat devient flou. Le calcul devient, �partir de ce moment non r�ersible.

Les seuls calculs pr�is sont les calculs de date ou de dur� effectu� uniquement avec des secondes, des minutes, des heures, des jours ou des semaines.

Dans la grammaire, la distinction faite entre les ann�s et mois d'une part et les semaines, jours, heures, minutes, secondes est rendue n�essaire par l'irr�ularit�des dur�s des mois et des ann�s.


Gestion de la date des syst�es *nix
Comme qu'il a ��rappel�dans l'introduction, la m�hode utilis� par les syst�es *nix pour repr�enter les dates est l'utilisation d'un simple compteur de secondes. Cela fonctionne �la perfection, mais a une limite li� �la capacit�de stockage du type de donn� utilis�pour mat�ialiser ce compteur. Les syst�es *nix actuels utilisent le type time_t pour mat�ialiser ce compteur. 'time_t' est une red�inition d'un entier long sign� Rappelons que l'entier est le type de donn� correspondant au mots g�� par le/les processeurs du syst�e, soit 32 bits sur les syst�es les plus courants actuellement. Sur ces syst�es, l'entier long a �alement une capacit�de 32 bits. La limite est donc celle li� �la capacit�d'un entier long sign�soit : de -2147483648 �2147483647.

La base de d�art du compteur a ��fix� arbitrairement par les cr�teurs d'Unix au 01/01/1970 �00:00:00. On peut donc manipuler des dates comprises entre le 13 D�embre 1901 �20:55:13 et le 19 Janvier 2038 �04:14:07. Toutefois certains syst�es n'admettent pas les valeurs n�atives. Dans ce cas les dates manipulables sont limit�s �la p�iode allant du 01/01/1970 au 19/01/2038.

Si l'on se limite �ce simple type 'time_t', on ne peut retrancher que 2147483647 secondes �une date. Plus le temps passe, plus on s'�oigne de la valeur minimum. Ainsi, par exemple, aujourd'hui 01/07/2002 - 2147483647 secondes donne comme date minimum, le 13 Juin 1934.

C'est pour pouvoir utiliser toute la capacit�du type time_t que timecalc utilise la librairie GNU Multi Precision. Il devient ainsi possible de stocker des entiers de toute capacit� et d'effectuer des calculs sur ceux ci. Par exemple, le calcul : "2002/07/01 23:00:00" - "1901/12/13 23:00:00" output format "%S" ; Produit le r�ultat 3173036961 Qui est sup�ieur �la capacit�de 'time_t'


AUTEUR

VOIR AUSSI

date(1) strftime(3)