Connaître le jour en rapport avec une date

Résolu
Bonjour,
je voudrais trouver un script qui me retourne le jour par rapport à une date donnée.
Exemple, aujourd'hui nous sommes le 4 mars, le résultat doit être 4 puisque c'est un jeudi.

J'utilise le code suivant mais cela fonctionne avec la fonction "date", comment y passer une variable ???
numjour= $(date +%w)

if test $numjour -eq 1
then

echo "lundi"

elif test $numjour -eq 1

echo "mardi"
fi
Mon Shell est #!/bin/ksh

Merci d'avance car je ne trouve rien du tout !
Configuration: Windows XP / Firefox 3.5.5

32 réponses

Résumé de la discussion

Trouver un script qui retourne le jour de la semaine à partir d'une date donnée pose problème dans un shell ksh sous Solaris, entre l'usage de date et celui de cal. Des propositions utilisent cal pour afficher le calendrier et awk/nawk pour isoler le jour, d'autres suggèrent date +%A ou Perl Time::Piece pour obtenir le jour d'une date fournie. Des échanges évoquent aussi des difficultés d'accès et des permissions sur des chemins ou modules, montrant que la solution dépend fortement de l'environnement et des outils disponibles. En pratique, l'approche reposant sur cal et un parseur pour extraire le jour à partir d'une date fournie peut être portable sur de nombreux systèmes Unix, selon les outils disponibles.

Bobot (l’IA à votre service)
  1. Contributeur
    ce script n'utilise ni perl, ni date mais la commande cal, qui devrait être la même sur Solaris, essaye
    $ $ cal 03 2010
         March 2010     
    Su Mo Tu We Th Fr Sa
        1  2  3  4  5  6
     7  8  9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30 31         
                        
    $ ./day 28/2/2010
    dimanche
    $ ./day 6/3/2010
    samedi
    $ ./day 04/7/1996
    jeudi
    $ ./day 30/11/2003
    dimanche
    $ ./day 04/9/2003
    jeudi
    $ ./day 6/6/1944
    mardi
    $ 
    $ cat day
    #!/bin/bash
    
    set $(echo $1 | sed -e 's+/+ +g')
    cal $2 $3 |nawk -v d=$1 'BEGIN{split("dimanche lundi mardi mercredi jeudi vendredi samedi",j)}
    NR>2 {sub("^0","",d) ; for(n=1;n<8;n++)if(substr($0,1+((n-1)*3),2)+0 == d)exit} ; END{print j[n]}'
    $ 
    
    3
    1. Modérateur
      Salut,

      Pourquoi te compliquais la vie ?

      date +%A

      Non ? ;-))
      0
      1. Bonjour,
        ben non ! Je réexplique car je ne suis peut-être pas clair.

        Je voudrais trouver le jour que représente une date.
        Donc pour reprendre mon exemple, si je passe la date du 4 mars, je devrais trouver jeudi.
        Exemple : numjour= $($MaVariable +%w) sauf que ça ne marche pas :-(

        Là vous me donner à nouveau la fonction date, mais moi je voudrais remplacer "date" par une variable qui contient une date.
        D'ailleurs j'ai une seconde question pour cela, comment écrit-on dans une variable Unix une valeur au format date ? Exemple en Access c'est #2008/24/12#, en sql server c'est '2008-30-02', etc, ... mais en Unix c'est comment ?

        Suis-je clair ?
        0
        1. Modérateur
          Re-

          Le "man date" t'aurait dit tout ça...
          Format de date AAA/MM/JJ ou AAA-MM-JJ

          date -d '2008/12/24' +'%A' 
          mercredi

          ;-))

          Édit : Format de date

          $ man woman
          Il n'y a pas de page de manuel pour woman.
          0
          1. Re,
            fonctionne pas, j'ai le message suivant :
            Mon code :

            #!/bin/ksh
            clear
            madate=2008/12/24
            jour=`date -d '$madate' +'%A'`
            echo "Num Jour ? $jour"
            exit

            J'ai essayé ceci également :

            #!/bin/ksh
            clear
            madate="2008/12/24"
            jour=`date -d $madate +'%A'`
            echo "Num Jour ? $jour"
            exit

            Résulat :

            date: illegal option -- d
            usage: date [-u] mmddHHMM[[cc]yy][.SS]
            date [-u] [+format]
            date -a [-]sss[.fff]

            Pourtant j'ai trouvé cet argument dans une page, mais j'ai aucune idée de pourquoi ça ne fonctionne pas
            0
            1. Modérateur
              Mets des quotes doubles autour de ta variable "$madate" et ça devrait aller mieux ;-))

              Edit : Oups j'avions pas vu la fin ;-((
              Quelle version de Linux ou Unix utilises-tu ?
              0
          2. Je travaille sous Unix , sauf erreur de ma part en Solaris 10 ?
            Mon Shell est KSH

            Je ne suis pas expert en Bash comme tu peux t'en douter, il existe une commande qui pourrait répondre plus précisément ?
            0
            1. Modérateur
              Arf, effectivement on est un peu restreint sous Solaris ;-((

              Une solution en Perl doit exister. faut attendre les experts pour ça, comme lami20j ou dubcek...
              0
          3. En effet 'dubcek' m'a déjà dépanné sur un autre problème de date et justement en Perl.
            Comment je fais pour lui écrire directement ?
            0
            1. Modérateur
              Par MP ;-))
              0
          4. Contributeur
            hello
            avec strptime, on décrit le format de date que l'on a : "%Y/%m/%d"
            $ date=2010/3/5
            $ perl -e 'use  Time::Piece ;my $t = Time::Piece->strptime($ARGV[0],"%Y/%m/%d");print $t->strftime("%u\n")' $date
            5
            $ 
            $ date=2010/8/7
            $ perl -e 'use  Time::Piece ;my $t = Time::Piece->strptime($ARGV[0],"%Y/%m/%d");print $t->strftime("%u\n")' $date
            6
            $ date=2008/12/24
            $ perl -e 'use  Time::Piece ;my $t = Time::Piece->strptime($ARGV[0],"%Y/%m/%d");print $t->strftime("%u\n")' $date
            3
            $ 
            
            0
            1. Salut dubceck,
              merci pour ta réponse mais sans te vexer elle n'est pas en rapport avec ma question de départ :-(

              Moi je cherche comment trouver une valeur qui m'indiquera que par exemple le 28/02/2010 c'est un dimanche.
              Mon shell est Ksh et je travaille sous Unix solaris 10.

              Est-ce que tu aurais quelque chose pour moi ?

              Jadis tu m'avais envoyé le code suivant, qui fonctionne très bien et qui me retourne la date au format désiré avec x jours en plus ou en moins :
              DAY=0
              TODAY_YYYYMMDD=$(perl -e 'use POSIX qw(strftime); print strftime "%Y%m%d", localtime(time()+3600*24*$ARGV[0])' -- $DAY)

              Tu n'aurais pas le même truc qui me retournerai : 1 pour un lundi, 2 pour un mardi MAIS avec une date fournit par variable ?

              bàt
              0
              1. Modérateur
                Ben avec les 2 derniers exemples de dubcek et en parsant le résultat dans un "case ... esac" avec les jours de la semaine ça devrait le faire, non ?

                case $jour in
                0|7)     echo "Dimanche"
                ;;
                1)       echo Lundi
                ;;
                etc.
                0
            2. Bon j'ai écrit ceci et j'ai le message d'erreur suivant :

              date1=2010/02/28
              result=$(perl -e 'use Time::Piece ;my $t = Time::Piece->strptime($ARGV[0],"%Y/%m/%d");print $t->strftime("%u\n")' $date)
              echo "resultat : $result"

              Messages :

              Can't locate Time/Piece.pm in @INC at -e line 1.
              BEGIN failed--compilation aborted at -e line 1.
              0
              1. Contributeur
                je voudrais trouver un script qui me retourne le jour par rapport à une date donnée.Exemple, aujourd'hui nous sommes le 4 mars, le résultat doit être 4 puisque c'est un jeudi.
                sic
                Moi je cherche comment trouver une valeur qui m'indiquera que par exemple le 28/02/2010 c'est un dimanche.
                $ date=28/2/2010
                $ perl -e 'use  Time::Piece ;my $t = Time::Piece->strptime($ARGV[0],"%d/%m/%Y");print $t->strftime("%A\n")' $date
                Sunday
                $ 
                
                0
                1. #!/bin/ksh
                  clear
                  date=28/2/2010
                  result=$(perl -e 'use Time::Piece ;my $t = Time::Piece->strptime($ARGV[0],"%d/%m/%Y");print $t->strftime("%A\n")' $date)

                  echo "resultat : $result"

                  Message d'erreur :

                  Can't locate Time/Piece.pm in @INC at -e line 1.
                  BEGIN failed--compilation aborted at -e line 1.
                  resultat :
                  0
                  1. Contributeur
                    Solaris perl ne connait pas Time::Piiece, as-tu un compilateur C ?
                    $ cat date.c
                    #include <stdio.h>
                    #include <time.h>
                    
                    main(int argc, char **argv)
                    {
                    	struct tm tm;
                    	char buf[128];
                    
                    	strptime(argv[1],"%d/%m/%Y", &tm);
                    	strftime(buf, sizeof(buf), "%A", &tm);
                    	printf("%s\n", buf);
                    }
                    $ make date
                    cc     date.c   -o date
                    $ ./date 28/2/2010
                    Sunday
                    $ 
                    0
                    1. Contributeur
                      avec
                      perl -e 'print "@INC"'
                      on peut voir quelles librairies Solaris perl utilise par defaut
                      0
                      1. pas de compliateur C :-(((

                        Merci pour la version, le résultat est : /app/gnu/lib/perl5/sun4-solaris /app/gnu/lib/perl5

                        Je suis coincé :-/
                        Je vous explique ce à quoi je désire aboutir.
                        Chaque fin de mois nous recevons un fichier très volumineux.
                        La date de réception variera selon le joue oeuvré. Si le dernier jour du mois tombe entre lundi et vendredi, il me suffit de trouver cette date et le tour est joué.
                        Par contre, et c'est là que je suis coincé, si le dernier jour du mois tombe un dimanche, comme par exemple le 28 février 2010, nous aurions reçu le fichier le 26 car le 26 c'est le dernier jour oeuvré du mois (nous ne travaillons pas le samedi). Donc voilà pourquoi je désire connaître à quel jour correspond une date ...
                        Si quelqu'un a une idée, il est le bienvenu !

                        Merci en tout cas.
                        0
                        1. dubcek,
                          j'ai peut-être parlé trop vite, regarde le code ci-dessous. Il permet de retirer ou d'ajouter x mois à une valeur yyyymm. Ca ressemble bien à du C ça non ? Mais j'ai aucune idée comment refaire ce que tu as écrit :-/

                          Le fichier s'appelle 'ajouter-mois' sans extension et je l'utilise comme suit :

                          MOIS=201003
                          MOIS=`ajouter-mois ${MOIS} -1`

                          Le résultat sera 201002

                          #!/usr/bin/nawk -f

                          BEGIN {
                          Mois = ARGV[1];
                          Nb = ARGV[2];
                          Annee = int(Mois / 100);
                          NumMois = Mois - Annee * 100;
                          if(Nb > 0) {
                          while(Nb > 0) {
                          if(NumMois < 12)
                          NumMois++;
                          else {
                          NumMois = 1;
                          Annee++;
                          }
                          Nb--;
                          }
                          }
                          else {
                          while(Nb < 0) {
                          if(NumMois > 1)
                          NumMois--;
                          else {
                          NumMois = 12;
                          Annee--;
                          }
                          Nb++;
                          }
                          }
                          printf("%2.2d%2.2d\n", Annee, NumMois);
                          }
                          0
                          1. Contributeur
                            regarde dans /usr si il n'y a pas d'autres librairies perl
                            find /usr -name "perl*" -type d -ls

                            dans /app/gnu/ n'y a-t-il pas la commande GNU date
                            find /app/gnu/ -name date -ls
                            0
                            1. Celles à qui j'ai accès sont :
                              82688 1 drwxr-xr-x 7 root bin 512 Feb 5 2009 /usr/sfw/lib/webmin/perlmod
                              13987 1 drwxr-xr-x 7 root bin 512 Feb 5 2009 /usr/perl5
                              79886 1 drwxr-xr-x 3 root bin 512 Feb 5 2009 /usr/apache/perl5
                              79902 1 drwxr-xr-x 2 root bin 512 Feb 6 2009 /usr/apache/perl5/5.8.4/sun4-solaris/auto/Apache/include/modules/perl
                              77490 1 drwxr-xr-x 8 root bin 512 Feb 6 2009 /usr/apache2/lib/perl
                              0
                              1. Contributeur
                                dans /app/gnu/ n'y a-t-il pas la commande GNU date
                                find /app/gnu/ -name date -ls
                                0
                                • 1
                                • 2