Savoir si une date est un dimanche

Résolu
dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis un train de réaliser un script sous unix qui programme une série de taches (un at dans un for).
ça c'est bon, j'arrive à gérer les dates, les changement des jour, de mois et d'année.
La pas de problème.
Je programme une tache par jour quelques que soit les conditions.

Ce que je souhaiterais faire (mais bon c'est facultatif) c'est rajouter une tache supplémentaires si le jour est un dimanche (comme le client est fermé, on peut mettre plus de taches sans problèmes).

Donc j'ai fais mon man date, et j'ai trouvé le %a qui me retourne le jour de la semaine.
Cool...
Sauf que je ne veux pas savoir quel jour est aujourd'hui.
Je veux savoir quel jour on sera demain, puis après demain, etc...
en fait je veux savoir quel jour on sera le 121125 ou le 121215
Est-ce qu'il y a une commande simple (en une ligne) qui permet de me retourner ça ?
J'ai en variable : $annee, $mois, $jour, $heure, $minute (chacun sur deux digits, il ne s'agit pas du timestamp courant, mais de celui que je vais utiliser pour ma commande at, dans le futur donc)
Attention, je suis sou Sco Unix, un vieux système dont la dernière mise à jour date de 2003, le bash est un peu spécifique.

Si y'a pas, ou si la commande nécessite un gros scripting, laissez tomber, c'est pas vital (sauf si ça vous amuse)



--
Stop failing the turing test !

5 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    calculer le jour d'une date avec ncal
    $ set 25 12 2012 ; ncal $2 $3 | awk -v d=$1 '{for(n=2; n<=NF;n++)if($n == d){print $1; exit }}'
    Tu
    $ set 14 11 2012 ; ncal $2 $3 | awk -v d=$1 '{for(n=2; n<=NF;n++)if($n == d){print $1; exit }}'
    We
    $ set 25 12 2012 ; ncal $2 $3 | awk -v d=$1 '{for(n=2; n<=NF;n++)if($n == d){print $1; exit }}'
    Tu
    $ set 6 1 2013 ; ncal $2 $3 | awk -v d=$1 '{for(n=2; n<=NF;n++)if($n == d){print $1; exit }}'
    Su
    $
    
    1
    1. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      sous debian (mais çà me sert à rien, j'en ai besoin sous unix) :
      root@LECBIARRITZ:/home/sesadm# man ncal
      Reformatting ncal(1), please wait...
      root@LECBIARRITZ:/home/sesadm# ncal
      November 2012
      Mo 5 12 19 26
      Tu 6 13 20 27
      We 7 14 21 28
      Th 1 8 15 22 29
      Fr 2 9 16 23 30
      Sa 3 10 17 24
      Su 4 11 18 25

      Sous unix :
      # man ncal
      man: ncal not found
      # ncal
      ncal: not found

      Merci quand même, je connaissais pas ncal
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    la commande date SCO connait ces options?
    $ date +%a -d tomorrow  
    Tue  
    $ date +%a -d "now+4 days"  
    Fri  
    $ date +%a -d "12/25/2012"  
    Tue  
    
    0
    1. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      pour les deux premiers, je sais que c'est pas le cas, c'est du linux (ça a été une révolution pour nos scripteurs quand on est passé à linux)
      pour le dernier, déja c'est pas dans le man, donc ça me parrait peut probable.

      # date +%a -d "12/25/2012"
      Usage: date [-u] [+format]
      date [-u] [-t [[CC]YYMMDDhhmm[.SS] | MMDDhhmm[YY] ]
      # date +%a -d 122512
      Usage: date [-u] [+format]
      date [-u] [-t [[CC]YYMMDDhhmm[.SS] | MMDDhhmm[YY] ]
      # date +%a -d "122512"
      Usage: date [-u] [+format]
      date [-u] [-t [[CC]YYMMDDhhmm[.SS] | MMDDhhmm[YY] ]

      Après vérification j'ai bien ce -d sur une debian (dans le man), mais pas sur du sco Unix.
      merci quand même.
      0
  3. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    options farfelue que je préfererais éviter.

    stocker la date actuelle dans une variable.
    Modifier la date actuelle lors du déroulement de mon script, pour pouvoir utiliser date +%a sur le now
    remettre la date courante à la fin du script.
    (techniquement, ça devrait marcher)

    Option moins farfelue mais un peu compliquée pour la valeur ajoutée

    je récupère la quantième du jour de la semaine en décimal avec %u lors du lancement du script
    j'incrémente la valeur en même temps que j'incrémente le jour du mois. et quand j'arrive à +6, je fais mon cas de figure, et je le reset à 0/1
    en l'écrivant comme ça, ça a pas l'air trop terrible, je garde ça dans un coin faute de mieux.
    0
    1. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      une autre bidouille, pour savoir quel jour de la semaine on sera dans n jours.
      je récupère le quantième avec %u
      j'ajoute n
      et je fais un modulo 7

      Pas utile dans mon cas, vu que je boucle en incrémentant les jours de toute façon, et que j'ai besoin de vérifier à chaque incrémentation, donc la méthode d'au dessus est mieux.
      0
  4. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    Dubcek : merci beaucoup, mais je pense que c'est mort pour moi dans le cas présent, je pense que je vais avoir recours au scripting et je vais réinventer le fil à couper le beurre.
    Par contre ça sert aux autres, et tu as largement répondu à la question, c'est pas ta faute, si je travaille sur un système qui date du siecle dernier.
    Je passe en résolu car tu as donné deux bonnes réponses pour les autres
    Si tu trouves d'autres idées, envoie toujours, on sait jamais.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    avec cal
    $ set 1 1 2013 ; cal $2 $3 | awk -v d=$1 '/^ / {gsub("   ", "xx ")} NR==2 {split($0,a);next} {for(n=1; n<=NF;n++)if($n == d){print a[n]; exit }}'
    Tu
    $
    
    0
    1. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      Je dis : "Monsieur " !!
      ça marche.
      Tu m'as perdu à
      '/^ /

      J'essaye de comprendre par moi même, et je reviens vers toi si j'ai besoin d'explications.
      0
    2. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
       
      ok, j'ai globalement compris
      la parti split($0,a);next snip print a[n] est un peu floue, mais je comprends l'idée générale.
      ça reste un truc de bourrin...
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      le gsub sert à avoir 7 champs sur chaque ligne, pour ensuite utiliser a[n], n étant le No du champ et a contenant les jours:
      $ cal 12 2012| awk '/^ / {gsub("   ", "xx ")} {print}' 
      xx December 2012 
      Su Mo Tu We Th Fr Sa 
      xx xx xx xx xx xx  1 
       2  3  4  5  6  7  8 
       ...
      on pourrait aussi remplacer le gsub par:
      BEGIN{FIELDWIDTHS="3 3 3 3 3 3 3"}
      FIELDWIDTHS est une option gawk, inconnue des vieux awk
      0