OVH Cloud OVH Cloud

Récupérer la date de la veille

27 réponses
Avatar
SDC
Bonjour,

Je cherche =E0 r=E9cup=E9rer la date de la veille sous la forme "%Y-%m-%d"
(formatage =E0 la "strftime") avec les commandes standard fournies avec
Solaris 8. Sous Linux, il y a "date -d yesterday '+%Y-%m-%d'" mais
l'option "-d" de "date" n'existe pas sous Solaris 8.

Pour l'instant j'ai :

gawk 'BEGIN { print strftime("%Y-%m-%d",
int(systime()/86400)*86400-7202) }'
# systime() =3D nombre de secondes depuis Epoch
# int(systime()/86400)*86400 =3D aujourd'hui =E0 01:00:00 ou 02:00:00
# int(systime()/86400)*86400-7202 =3D hier =E0 22:59:58 ou 23:59:58

Mais cela ne fonctionne qu'en Central European Time, et j'aimerai
quelque chose qui marche partout.

-Sylvain

10 réponses

1 2 3
Avatar
Stephane Chazelas
On 27 Mar 2006 00:22:52 -0800, SDC wrote:
Bonjour,

Je cherche à récupérer la date de la veille sous la forme "%Y-%m-%d"
(formatage à la "strftime") avec les commandes standard fournies avec
Solaris 8. Sous Linux, il y a "date -d yesterday '+%Y-%m-%d'" mais
l'option "-d" de "date" n'existe pas sous Solaris 8.

Pour l'instant j'ai :

gawk 'BEGIN { print strftime("%Y-%m-%d",
int(systime()/86400)*86400-7202) }'
# systime() = nombre de secondes depuis Epoch
# int(systime()/86400)*86400 = aujourd'hui à 01:00:00 ou 02:00:00
# int(systime()/86400)*86400-7202 = hier à 22:59:58 ou 23:59:58

Mais cela ne fonctionne qu'en Central European Time, et j'aimerai
quelque chose qui marche partout.
[...]


perl -MPOSIX -le '
@t = localtime;
$t[2]=-12;
print strftime("%Y-%m-%d", localtime (mktime(@t)))'


ou avec un gawk recent:

gawk '
BEGIN {
print strftime("%Y-%m-%d",
mktime(strftime("%Y %m %d -12 0 0")))
}'

Sinon, utiliser les fonctions sh POSIX (utiliser /usr/xpg4/bin/sh
sous Solaris) a http://stchaz.free.fr/wide_strftime.sh

Ou faire le calcul a la main ou aller voir du coté de la FAQ de
comp.unix.shell

--
Stephane

Avatar
Paul Gaborit
À (at) 27 Mar 2006 16:28:48 GMT,
Stephane Chazelas écrivait (wrote):
perl -MPOSIX -le '
@t = localtime;
$t[2]=-12;
print strftime("%Y-%m-%d", localtime (mktime(@t)))'


ou avec un gawk recent:

gawk '
BEGIN {
print strftime("%Y-%m-%d",
mktime(strftime("%Y %m %d -12 0 0")))
}'


Les '-12' ne devraient-ils pas être des '-24' ?

De plus, que se passe-t-il si le '-12' ou le '-24' amène sur une heure
qui n'existe pas (par exemple au moment du changement d'heure
été/hiver) ?

Juste pour le fun, voici une instruction (qui, entre autres,
souffre du même défaut) pour afficher la date du lendemain :

sleep 86400; date

;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

Avatar
Stephane Chazelas
On Mon, 27 Mar 2006 18:50:31 +0200, Paul Gaborit wrote:

À (at) 27 Mar 2006 16:28:48 GMT,
Stephane Chazelas écrivait (wrote):
perl -MPOSIX -le '
@t = localtime;
$t[2]=-12;
print strftime("%Y-%m-%d", localtime (mktime(@t)))'


ou avec un gawk recent:

gawk '
BEGIN {
print strftime("%Y-%m-%d",
mktime(strftime("%Y %m %d -12 0 0")))
}'


Les '-12' ne devraient-ils pas être des '-24' ?


Non, c'est "hour = -12" (ca n'enleve pas 12h a l'heure
courante), donc midi (ou eventuellement (peut-etre) 11h ou 13h
si ya eu un changement d'heure) la veille.

De plus, que se passe-t-il si le '-12' ou le '-24' amène sur une heure
qui n'existe pas (par exemple au moment du changement d'heure
été/hiver) ?


Voir plus haut.

Juste pour le fun, voici une instruction (qui, entre autres,
souffre du même défaut) pour afficher la date du lendemain :

sleep 86400; date


plutot:

date=$(date); sleep 86400; printf '%sn' "$date"

--
Stephane


Avatar
Harpo
Paul Gaborit wrote:


Juste pour le fun, voici une instruction (qui, entre autres,
souffre du même défaut) pour afficher la date du lendemain :

sleep 86400; date


Le problème est que sleep n'accepte pas de nombre négatif.

;-)


idem

Mais que se passe-t-il en cas de changement d'heure... ?

Avatar
JustMe
Il se trouve que SDC a formulé :
Bonjour,

Je cherche à récupérer la date de la veille sous la forme "%Y-%m-%d"
(formatage à la "strftime") avec les commandes standard fournies avec
Solaris 8. Sous Linux, il y a "date -d yesterday '+%Y-%m-%d'" mais
l'option "-d" de "date" n'existe pas sous Solaris 8.

Pour l'instant j'ai :

gawk 'BEGIN { print strftime("%Y-%m-%d",
int(systime()/86400)*86400-7202) }'
# systime() = nombre de secondes depuis Epoch
# int(systime()/86400)*86400 = aujourd'hui à 01:00:00 ou 02:00:00
# int(systime()/86400)*86400-7202 = hier à 22:59:58 ou 23:59:58

Mais cela ne fonctionne qu'en Central European Time, et j'aimerai
quelque chose qui marche partout.

-Sylvain


ca doit marcher à toute heure de la journee ou slt à un moment precis ?

Avatar
SDC
Il faudrait que ça fonctionne à tout moment de la journée.
Avatar
SDC
Déjà, j'ai découvert la fonction "mktime" que j'avais zappé en
lisant le man de gawk.

Du coup, est-ce que vous voyez des problèmes (notamment avec les
heures d'été/d'hiver) avec :

gawk '
BEGIN {
print strftime("%Y-%m-%d %H:%M:%S",
mktime(strftime("%Y %m -1 0 0 0")))
}'

Nous sommes le 28 mars, en remplaçant le -1 par -28, on obtiens bien
le 31 janvier.

Merci.
Avatar
Stephane Chazelas
On 28 Mar 2006 00:19:42 -0800, SDC wrote:

Déjà, j'ai découvert la fonction "mktime" que j'avais zappé en
lisant le man de gawk.

Du coup, est-ce que vous voyez des problèmes (notamment avec les
heures d'été/d'hiver) avec :

gawk '
BEGIN {
print strftime("%Y-%m-%d %H:%M:%S",
mktime(strftime("%Y %m -1 0 0 0")))
}'


Ca devrait donner l'avant-dernier jour du mois precedent (le
jour -1 du mois courant, 0 etant le dernier jour du mois
precedent). Si tu veux la veille, c'est pas la meme chose, c'est
ce que j'ai indiqué dans mon message.


Nous sommes le 28 mars, en remplaçant le -1 par -28, on obtiens bien
le 31 janvier.


Le -28 du mois de mars ca doit etre en gros le 31 janvier, oui.

Si tu veux la veille sans utiliser -12 pour l'heure (mais je ne
vois pas pourquoi), alors, ca serait plutot:

gawk '
BEGIN {
split(strftime("%Y %m %d"), a)
print strftime("%Y-%m-%d %H:%M:%S",
mktime(a[1] " " a[2] " " a[3]-1 " 0 0 0"))
}'

Mais j'aurais plus confiance en la solution qui donne la date
d'aujourd'hui à -12 heures.

--
Stephane

Avatar
SDC
La proposition :

gawk '
BEGIN {
print strftime("%Y-%m-%d %H:%M:%S",
mktime(strftime("%Y %m -1 0 0 0")))
}'

était effectivement stupide.

Je l'ai écrite en pensant que -1 voulait dire -1 jour par rapport à
la date d'aujourd'hui (et non -1 du mois en cours). J'ai même testé,
mais j'ai lu trop vite le résultat... Ca donnait bien le 27, mais le
27 février (et non mars)... Si j'avais essayé ça hier, j'aurai vu
mon erreur tout de suite...

OK pour la proposition avec -12 heures, mais pourquoi -12 et pas -1, -2
ou -18 ?

-SDC
Avatar
Stephane Chazelas
2006-03-28, 07:47(-08), SDC:
La proposition :

gawk '
BEGIN {
print strftime("%Y-%m-%d %H:%M:%S",
mktime(strftime("%Y %m -1 0 0 0")))
}'

était effectivement stupide.

Je l'ai écrite en pensant que -1 voulait dire -1 jour par rapport à
la date d'aujourd'hui (et non -1 du mois en cours). J'ai même testé,
mais j'ai lu trop vite le résultat... Ca donnait bien le 27, mais le
27 février (et non mars)... Si j'avais essayé ça hier, j'aurai vu
mon erreur tout de suite...

OK pour la proposition avec -12 heures, mais pourquoi -12 et pas -1, -2
ou -18 ?
[...]


J'imagine que les autres marcheront aussi, mais comme -12, c'est
le milieu du jour precedent, je prefere minimiser les chances
d'avoir des problemes avec les changements d'heure.


--
Stéphane

1 2 3