divendres, 18 de gener del 2008

Tractament de Unix Timestamps amb l'Open Office

AVÍS: em temo que aquest article no els serà de gaire ajuda a la majoria dels lectors, però crec que és interessant que estigui publicat.

Preludi de l'article

Els ordinadors són molt bons tractant dades numèriques simples com els nombres enters (de fet, és pel que serveixen, i no per a la pirateria com creuen alguns). El problema és com tractar dades més complexes. En el cas dels caràcters (o sigui, lletres) la solució passa simplement per assignar un nombre a cadascuna de les lletres (en ASCII la "a" és el 97, la "r" el 114, el "1" el 49 i la "A" el 65, per exemple). Així, si sumem "1" i "A" ens dóna 72, que és "r". Tot molt matemàtic.

Però, per bé o per desgràcia, als humans ens agrada complicar-nos la vida. En un moment donat, ens va semblar una bona idea que l'any tingués 12 mesos, que aquests tinguessin entre 31 i 28 dies, que cada dia fossin 24 hores, que cada hora 60 minuts i cada minut 60 segons. D'aquesta manera vàrem convertir el temps que un càlcul realment complexe, gens matemàtic.

Donat que la comptabilitat de les empreses es realitza amb ordinador, i que tothom sol voler cobrar a final de mes, els primers informàtics varen enginyar-se diversos sistemes per convertir el temps en nombres simples. Un dels més conegut i estès és el Unix Timestamp, que compta els segons que han transcorregut des de l'1 de gener de 1970 (o sigui, 0 és el 1-1-1970 a les 0:00:00 i el 384609600 el 10-3-1982 a les 12:00:00).

Tot i això, el Unix Time no és una solució ideal ni acceptada al cent per cent i, per bé que pel programador és molt còmode, alguns programes com les fulles de càlcul (MS Excel i, en conseqüència, el seu clon opensource, l'Open Office Spreadsheet) tenen la seva pròpia numeració per les dates.

I ara, l'article

Fa un parell de dies em varen encarregar extreure informació del log de visites d'un lloc web i enviar-la en format de fulla de càlcul. Els logs usen el temps identificat per Unix Timestamps però l'Open Office Spreadsheet no. Després de buscar-ho per Internet, vaig aconseguir un mètode senzill per traduir Unix Time al temps de la fulla de càlcul. Donat que no seré l'única persona amb aquest problema, he decidit publicar la solució que vaig aconseguir.

El primer pas es descarregar-se un plugin per a l'Open Office anomenat "Date Time 2". Aquesta extensió ens afegeix moltes funcions específiques per treballar amb dates. La url per a descarregar-la és:

http://extensions.services.openoffice.org/project/DateTime2

Com a norma general, per instal·lar el plugin només cal fer doble clic sobre l'arxiu. Però si un cas no us funciona, ho podeu fer manualment posant l'arxiu a la carpeta "plugin" del programa. En el cas de d'Ubuntu (GNU-Linux) aquest directori sol ser el següent (via gnutips):

/usr/lib/openoffice/program/plugin

Ara ja podeu obrir el programa de fulla de calcul i enganxar les dades amb el timestamp. Suposant que el timestamp es troba a la cel·la A1, la fórmula en anglès per a convertir el temps és (via els fòrums del programa):

=A1/86400+DATEVALUE("1/1/1970")

Per desgràcia, l'Open Office té el mal costum de copiar sempre al MS Office, així que les fórmules canvien segons l'idioma del programa (és horrible, però que vols fer-hi). Així que la fórmula per a fer el mateix en un Open Office en català és:

=A1/86400+VALORDATA("1/1/1970")

Amb aquesta fórmula és crea un nou valor compatible amb les dates de l'Open Office. Un cop fet, tan sols és necessari executar les funcions "day" (o "dia"), "month" (o "mes") i "year" (o "any") per extreure'n les informació que necessitem. Si voleu veure totes les funcions noves de temps, només cal que aneu a l'apartat de "Data i Hora" del llistat de funcions disponibles.

NOTA: com podeu suposar, no he calcular manualment els segons fins al 10-3-1982 a les 12:00. A Internet hi ha centenars de conversors com aquest.