2010-07-01 4 views

Répondre

1

Vous venez d'entrer dans un patch TRÈS désordonné. Les règles de l'heure d'été sont complexes et définies par l'utilisateur. Il n'existe donc pas d'algorithme utilisable. Pour une idée, voir cette page: http://home.tiscali.nl/~t876506/TZworld.html. Cela montre seulement les règles actuelles. Si vous souhaitez obtenir les règles par programme ou pour les dates antérieures, vous devrez interroger directement la base de données tz. Ce n'est pas facile ni trivial et le processus prendrait plus de temps à expliquer que ce qui est approprié ici (aussi, je devrais le comprendre :)) mais l'information dont vous avez besoin pour commencer est sur cette page: http://www.twinsun.com/tz/tz-link.htm.

Si vous faites des calculs de temps et devez prendre en compte le décalage, il sera plus facile de simplement utiliser le temps joda. Voici un lien vers celui-ci: http://joda-time.sourceforge.net/. Il contient toutes les informations de la base de données TZ, donc vous n'avez pas à l'analyser. Vous devrez cependant le tenir à jour car les règles changent régulièrement.

En note, il peut y avoir un moyen d'interroger les dates de début et de fin de l'heure d'été en dehors de joda-time pour un fuseau horaire donné mais je ne l'ai pas trouvé.

+0

Pour quiconque trébuche sur ce post. Il y a une autre réponse sur stackoverflow sur comment utiliser Joda-Time pour obtenir la prochaine transition Timezone: http://stackoverflow.com/questions/1449500/get-daylight-saving-transition-dates-for-time-zones-in- Java – Mike

2

il n'y a aucun moyen de le faire directement, mais vous pouvez utiliser TimeZone.isDaylightTime (date), comme dans:

TimeZone tz = TimeZone.getTimeZone ("America/Denver") ; 
Date date = new GregorianCalendar (2010, 10, 15).getTime() ; 
if (tz.isDaylightTime (date)) { 
// dst in effect code 
    } 
else { 
// dst not in effect code 
    } 

Bien sûr, pour obtenir la date de début (si cela est vraiment ce que vous avez besoin) , vous devez parcourir tous les jours dans une année donnée et vérifier chacun ... ce qui serait assez inefficace. Aussi, comme indiqué dans la réponse ci-dessus, autant que je sache, les informations sur l'heure d'été sont compilées dans la bibliothèque java.util et donc si une municipalité change ses lois sur le début/fin de dst, vous obtiendrez des résultats incorrects.

En outre, il semble que l'implémentation de java.util.TimeZone dans Android est cassée (au moins dans 2.2). Par exemple

TimeZone denver = TimeZone.getTimeZone ("America/Denver") ; 
TimeZone phoenix = TimeZone.getTimeZone ("America/Phoenix") ; 

== vrai; // qu'il ne devrait pas

Exécuté sous l'émulation dans Eclipse, denver.hasSameRules (phoenix) renvoie true, et il doit retourner false: les deux sont GMT-7: 00 mais Phoenix n'utilise pas dst. Je n'ai pas accès à des appareils Android pour tester si c'est juste un problème avec l'émulateur ou non. J'ai commencé à chercher dans cette archive une réponse à ce problème de denver == phoenix et je suis tombé sur votre post alors j'ai pensé que je répondrais.

Questions connexes