IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Calcul de date en script shell


Sujet :

Linux

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut Calcul de date en script shell
    Bonjour,

    Je cherche à calculer des dates à l'aide d'un script shell.

    J'ai en entrée une date sous la forme dd/mm/AAAA stockée dans une variable

    Je souhaiterais obtenir à partir de cette date
    - la date du premier lundi précédent cette date
    - la date du premier dimanche suivant cette date

    Si quelqu'un peut m'aider...

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    qu'as-tu déjà essayé ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    J'ai essayé de faire des calculs manuels.

    Je récupère le numéro du jour correspondant à la date avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jour=S`date --date=$datesemaine +%u`
    Je fait la différence entre ce numéro de jour et le lundi et le dimanche.
    Ensuite, j'ajoute ou je retire la différence entre le jour en question et le lundi ou le dimanche....


    Le seul souci c'est que dès que je commence à gérer les cas avec un lundi ou un dimanche sur un autre mois, cela commence à être sérieusement compliqué.

    Il existe des commandes toutes faites en Perl, mais je ne peux pas les utiliser.
    Bref, il ne me reste que le Shell.

    Ma question est surtout: existe-t-il une méthode "relativement" simple pour faire cela?

  4. #4
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut avec GNU date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    JS=$(date +%u)
    date -d "$((1-JS)) days"
    date -d "$((7-JS)) days"

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    @fransoo

    Merci fransoo pour ta proposition, mais cela ne fonctionne que si on désire faire ces calculs à partir de la date du jour.

    Mais en ce qui me concerne je doit gérer cela avec une date qui n'est pas celle du jour et qui est stockée dans une variable.

  6. #6
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    D="15/08/2010"
    DD="${D:3:3}${D:0:3}${D:6:4}" # pour mettre au format mm/dd/yyyy
    JS=$(date -d $DD +%u)
    date -d "$DD $((1-JS)) days"
    date -d "$DD $((7-JS)) days"
    -------------- EDIT ------------------
    Juste pour le fun, j'ai découvert ça sur GNU date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    date -d "last Monday"
    date -d "next Sunday"
    Mais je n'ai pas réussi en partant d'une date prédéterminée

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    c'est plutôt pas mal, fransoo

    mais le dimanche qui suit le 1er août, devrait être le 8 août, et le lundi précédant le 2, être le 26 juillet
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Pas regardé à fond, mais il y a des observateurs perspicaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/bin/bash
    D="15/08/2010"
    #~ DD="${D:3:3}${D:0:3}${D:6:4}" # pour mettre au format mm/dd/yyyy
    DD="${D:6:4}${D:3:2}${D:0:2}" # pour mettre au format yyyymmdd
     
    JS=$(date -d $DD +%u)
    ((JS==1)) && LUN=-7 || LUN=$((1-JS))
    ((JS==7)) && DIM=7 || DIM=$((7-JS))
     
    echo -n "Date de référence : "
    date -d "$DD"
    echo -n "Lundi précédent :   "
    date -d "$DD $LUN days"
    echo -n "Dimanche suivant :  "
    date -d "$DD $DIM days"

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    que l'on pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((jS==1?(Lun=-7):(Lun=$((1-jS)))),(jS==7?(Dim=7):(Dim=$((7-jS))))))
    mais bonjour! le déboggage
    NB: il vaut mieux éviter les noms de variables tout en majuscules, pour éviter les collisions avec des variables d'environnement.

    Pour ma part, j'étais parti sur %w :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for i in 0{1..9} {10..20}
    do DateFr=$i/08/2010
    
       IFS=/ read jj mm aaaa <<<"$DateFr"
       DateC="$mm/$jj/$aaaa"
       qJ=$(date -d"$DateC" +%w)
    
       echo "la date donnée est le : $(date -d"$DateC" +%c)"
       echo -n "le lundi précédent était le : "
       date -d"$DateC -$(( (qJ==1?(n=7):(n=6)),(qJ>1?qJ-1:n) ))days" +'%d/%m/%Y %c'
       echo "le dimanche suivant sera le : "
       date -d"$DateC +$((qJ?7-qJ:7))days" +'%d/%m/%Y %c'
       echo "---"
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    que l'on pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((jS==1?(Lun=-7):(Lun=$((1-jS)))),(jS==7?(Dim=7):(Dim=$((7-jS))))))
    Il faut que j'étudie un peu plus cette notation, je l'ai peu vue mais paraît puissante.
    Citation Envoyé par N_BaH Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (...)
    IFS=/ read jj mm aaaa <<<"$DateFr"
    (...)
    Ça aussi ça me plaît, sûrement pas assez utilisé... (je n'avais pas trouvé autre chose pour passer les commandes à éxécuter pour un script qui s'auto-planifiait).
    J'adore les trucs et astuces en bash

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Merci à vous tous.

    Ceci étant dit, dans mon cas, je ne pourrais pas tomber dans le cas particulier mentionné par N_BaH.

    Je ne peux pas avoir comme date intiale un lundi ou un dimanche.
    du coup je reste sur la proposition initial de fansoo.

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    Je suis nouveau sur le forum,surnom " saamy"...
    J'ai lu ce sujet avec attention car, je suis moi même bloqué sur un script avec une fonction similaire à celle traiter dans ce topic.

    Mais j'ai effectuée plusieurs test, mais vos commandes ne passe pas sur ma machine, car il ne traite pas le batch, je suis en KSH et c'est SunOS 5.8.

    En effet, je souhaite killé un process figé depuis plus de 30min.
    Pour cela, j'utilise la commande date, je filtre que sur l'heure, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >date
    Mon Oct 11 10:38:14 MEST 2010
    -------
    > date | awk '{print($4);}'
    10:38:21
    Cependant, la notion que je n'arrive pas à gerer c'est de faire le moins 30 mins de la commande : date | awk '{print($4);}'

    Je vous remercie par avance de votre aide sur le sujet.

    PS: si vous jugez que j'ai posté sur un mauvais topic merci de bien vouloir m'en excusez.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petit Script Shell pour changement de date automatique
    Par 20132014 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 18/06/2013, 13h07
  2. Conversion et comparaison des dates en script shell
    Par sorilazer dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 16/11/2012, 14h51
  3. Script shell - problème avec date
    Par spartiates59 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 18/08/2011, 18h15
  4. Shell KSH calcul de date
    Par fgrassi dans le forum Linux
    Réponses: 5
    Dernier message: 10/08/2009, 14h05
  5. SCRIPT CALCULANT LA DATE
    Par Redouane dans le forum ASP
    Réponses: 3
    Dernier message: 17/03/2004, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo