20081027

uso del time zone en UNIX ó por que Superman la cagó ...

Hace unos días solicite a mis compañeros de trabajo me reenviaran este correo que tuve a bien redactar en su momento con la intención de compartir y asi mismo divertirlos.

Sucedió en una noche de trabajo bajo la presión de entregar un proyecto a la empresa, que la discusión entre dos compañeros de trabajo le llevo a uno decirle al otro, que el podría arreglar el programa en cuestión siempre y cuando le dieran una hora, a lo cual el otro en un tono bastante sarcastico le replicó: "pues vas superman..."


He aquí su historia:


Resulta que Superman estaba tratando de obtener la superinformation del superserver del superdía anterior, via el siguiente superscript ...

#!/bin/sh
FILE='/home/proyect/app/mania'`TZ=aaa24 date +%m%d%Y`'.cvs'
echo $FILE
MIN=0
sftp mania@12.10.20.88 < file2="'mania'`TZ=">
...
peeeero cuando se hicieron las superpruebas para la superliberación, pues nel ! estaba jalando la superinformación del superdía actual (o sea, hoy... tudeiii dijera Fox)

Cosa que desato la ira ( si IRA, ira como se estan dando .. ira como se dijeron .. ) de Superman en contra de Lex Luthor y sus batinenas... ( no las del excesss... )


Ni el superserver estaba mal configurado, ni el shell esta mal ... vaya ni Oraclito pues !


Cosa de poner atención a como junciona el tieeeempo en el planeta tierra, ahi les

dejo caer la explicación.

How to date command works in unix for dummies in 20 mins !
(no more less && so so anymore ..., mins is minuts, not means... NfD*, NfD* is Note for Dummies)

el siguiente comandito, ese que aparece en el superscript:

$ TZ=aaa24 date
es el equivalente a:
$ TZ=UTC+24 date
Ya que la idea es que nos regrese la fecha del día de ayer, o sea el anterior al día de hoy :-P (digo, explico por aquello del dummies, oka ? )

Veamos:

  • Partimos del hecho que UTC(CDT) es la base para calcular la hora en distintos paises vaya, es lo _innnnn_... el GTM wuakala, ya no esta a la moda
  • Nuestra Zona Horaria en UTC es UTC+5, es decir tenemos 5 horas de retraso (si, el + maaas es pa retrasar.. ) respecto a la Hora Universal Coordinada (UTC es el acronimo para Universal Time Coordinated NfD*).
  • Ejemplos, en este momento en México son las 5:40AM, veamos la hora en otros paises (No me creen ?):
UTC              = 10:40
Mexico (UTC+5) = 05:40
China (UTC-8) = 18:40
Italia (UTC-2) = 12:40
Brasil (UTC+3) = 07:40
  • Solo podemos movernos entre -24 y +24, numeros mayores(o menores) no aplican. (aquí no hay NfD*. si, punto)

Para comprender por que Superman la cagó, veamos la siguiente tabla:

+---------------------------------+
| LOCAL | UTC | UTC-24 | UTC+24 |
| 0:00 | 5:00 | 26-Ago | 25-Ago |
| 1:00 | 6:00 | 26-Ago | 25-Ago |
| 2:00 | 7:00 | 26-Ago | 25-Ago |
| 3:00 | 8:00 | 26-Ago | 25-Ago |
| 4:00 | 9:00 | 26-Ago | 25-Ago |
| 5:00 | 10:00 | 26-Ago | 25-Ago |
| 6:00 | 11:00 | 26-Ago | 25-Ago |
| 7:00 | 12:00 | 26-Ago | 25-Ago |
| 8:00 | 13:00 | 26-Ago | 25-Ago |
| 9:00 | 14:00 | 26-Ago | 25-Ago |
| 10:00 | 15:00 | 26-Ago | 25-Ago |
| 11:00 | 16:00 | 26-Ago | 25-Ago |
| 12:00 | 17:00 | 26-Ago | 25-Ago |
| 13:00 | 18:00 | 26-Ago | 25-Ago |
| 14:00 | 19:00 | 26-Ago | 25-Ago |
| 15:00 | 20:00 | 26-Ago | 25-Ago |
| 16:00 | 21:00 | 26-Ago | 25-Ago |
| 17:00 | 22:00 | 26-Ago |*25-Ago | * hasta aquí, Superman felíz
| 18:00 | 23:00 | 26-Ago | 25-Ago |
| 19:00 | 0:00 | 27-Ago |*26-Ago | * aqui la puerka tuerce el rabo !
| 20:00 | 1:00 | 27-Ago | 26-Ago |
| 21:00 | 2:00 | 27-Ago | 26-Ago |
| 22:00 | 3:00 | 27-Ago | 26-Ago |
| 23:00 | 4:00 | 27-Ago |*26-Ago | * aqui Superman vs Batiunix
+---------------------------------+
  • En correspondencia a nuestra zona horaria (+5), para poder obtener una fecha pasada o futura necesitaremos movernos entre las 0 y las 18 hrs, cuando se den las 19 horas, entonces nos dara el mismo día.
Por qué ?

Bueno, 19hrs + 5hrs (de nuestro TZ "taimmm zonnnn") = 24hrs ó 0hrs es decir, cuando nos da 0hrs ni se suma ni se resta, sino todo lo contrario.. ehhh ! ORALE CHAMACOS !


Como Superman quería la fecha del día anterior, siendo hoy 26-Ago, necesitaba un 25-Ago para el superscript; cuando lo mando a ejecutar a la 5PM sí le regreso el día anterior (25); pero cuando lo ejecutamos a las 23PM al plancharlo en produción nos regreso el mismo día (26) y laaaastima, dieron reversa ...


Por esa razón, Superman la cagó.


Luego entonces, hay que zurrar a la gente pero también hay que pasarle el papel

pa'que se limpien...

Cómo calcular fechas en:

PERL
"un dia anterior = ayer"
$ perl -e "print scalar(localtime(time()-86400))"

"un dia después = mañana"
$ perl -e "print scalar(localtime(time()+86400))"


C (muy 3133t)

#include
#include
int main()
{
time_t localtime;
time(&localtime);
localtime = localtime - 86400;
printf("%s",ctime(&localtime));
return 0;
}

$ cc yesterday.c -o yesterday
$ ./yesterday

Después, todo fue miel sobre ojuelas :-)

code it !

1 comentario:

adolf0 dijo...

ja ja ja ja entre la diverida de la historia y la redacción ya aprendí algo nuevo.

Gracias :)