« Précédent Suivant »

uClibc et Timezone Info (TZ)

Le 05/05/2011 à 10:42

S'il y a bien des intérêts à utiliser la uClibC, il y a tout de même pas mal d'inconvénients. Dans le lot, il y a la gestion des timezones.

Alors que la glibc utilise la zoneinfo database, /etc/timezone et /etc/localtime pour manipuler les timezones, la uClibC, quant à elle utilise la variable TZ. C'est une des différences qui existe entre ces deux libc. Donc pour définir une timezone, il faut définir la variable d'environnement TZ ou bien la décrire dans le fichier /etc/TZ. Une modification de TZ et la fonction date prend en compte le changement.

Sauf que la valeur à renseigner, bien que standardisée n'est listée nullepart sur le net sauf ici (mais hélas elle n'est pas exhaustive). J'ai pourtant bien cherché... Bref pas super pratique pour gérer l'international quand on nous dit quel format utiliser sans pour autant donner de liste. Théoriquement, la liste peut se refaire à la main, en se basant sur les spécifications. Mais avec 405 timezones dans le monde, je ne suis pas super fan. Si quelqu'un a une autre source, je suis vraiment preneur...

Un collègue m'a finalement bien sorti de la galère. La solution, se baser sur la zoneinfo database d'un système sous glibc pour générer le format TZ avec un petit script bash. Et ça s'avère bien pratique, donc je partage !

#!/bin/bash
for i in `tail -n+28 /usr/share/zoneinfo/zone.tab | cut -f3`; do
    echo -e "$i;$(cat /usr/share/zoneinfo/$i | tail -n1)"
done

Pour une raison encore inconnue, ce premier script retourne 10 timezones sans valeur de TZ. Le script suivant permet de les échapper.

#!/bin/bash
for i in `tail -n+28 /usr/share/zoneinfo/zone.tab | cut -f3`; do
    TZ=$(cat /usr/share/zoneinfo/$i | tail -n1)
    [ $(echo $TZ | wc -c) -gt 1 ] && echo -e "$i;$TZ"
done

Ce qui nous donne une jolie liste exploitable en C :]

Europe/Andorra;CET-1CEST,M3.5.0,M10.5.0/3
Asia/Dubai;GST-4
Asia/Kabul;AFT-4:30
America/Antigua;AST4
America/Anguilla;AST4
Europe/Tirane;CET-1CEST,M3.5.0,M10.5.0/3
Asia/Yerevan;AMT-4AMST,M3.5.0,M10.5.0/3
America/Curacao;AST4
Africa/Luanda;WAT-1
Antarctica/McMurdo;NZST-12NZDT,M9.5.0,M4.1.0/3
Antarctica/South_Pole;NZST-12NZDT,M9.5.0,M4.1.0/3
Antarctica/Rothera;ROTT3
Antarctica/Palmer;
Antarctica/Mawson;MAWT-5
Antarctica/Davis;DAVT-7
Antarctica/Casey;WST-8
Antarctica/Vostok;VOST-6
Antarctica/DumontDUrville;DDUT-10
Antarctica/Syowa;SYOT-3
Antarctica/Macquarie;MIST-11
America/Argentina/Buenos_Aires;ART3
America/Argentina/Cordoba;ART3
America/Argentina/Salta;ART3
...
« Précédent Suivant »
Commentaires
blog comments powered by Disqus