Connaître le jour en rapport avec une date

Résolu
OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   -  
OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   -
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

  • 1
  • 2
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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Pourquoi te compliquais la vie ?

    date +%A

    Non ? ;-))
    0
  3. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  7. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  8. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Par MP ;-))
      0
  9. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    lol, merci m'sieur
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  11. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  12. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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
  13. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  14. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    #!/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
  15. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  16. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    avec
    perl -e 'print "@INC"'
    on peut voir quelles librairies Solaris perl utilise par defaut
    0
  17. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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
  18. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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
  19. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  20. OlivrT Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   36
     
    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
  21. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    dans /app/gnu/ n'y a-t-il pas la commande GNU date
    find /app/gnu/ -name date -ls
    0
  • 1
  • 2