Savoir si une date est un dimanche

Résolu/Fermé
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 - 12 nov. 2012 à 16:10
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 13 nov. 2012 à 13:53
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)



5 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 nov. 2012 à 09:25
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
Modifié par dna.factory le 13/11/2012 à 10:07
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 12/11/2012 à 16:26
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
12 nov. 2012 à 16:44
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
12 nov. 2012 à 16:50
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
13 nov. 2012 à 10:11
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
13 nov. 2012 à 10:07
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 nov. 2012 à 10:25
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
Modifié par dna.factory le 13/11/2012 à 12:18
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
dna.factory Messages postés 24957 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 26 avril 2024 1 609
13 nov. 2012 à 13:39
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 13/11/2012 à 14:40
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