2010-11-24 11 views
3

J'ai un code qui fonctionne très bien dans l'émulateur mais sur un périphérique 3gs il se bloque avec une TimeZoneNotFoundException.Le fuseau horaire renvoie toujours TimeZoneNotFoundException

La raison de mon code est de convertir l'heure du serveur (donnée en CET) dans le fuseau horaire local.

var t = TimeZoneInfo.FindSystemTimeZoneById(TimeZone.CurrentTimeZone.StandardName); 
//This line below crashes    
double localOffset = t.GetUtcOffset(DateTime.Now).TotalMilliseconds; 

Le fuseau horaire local est dans mon cas CET.

Une idée de pourquoi cela ne fonctionne pas dans Monotouch? Est-ce une limitation de MonoTouch? Puisque le code fonctionne dans l'émulateur, je ne peux pas voir que c'est une erreur de programmation? J'ai essayé de réécrire cela mais toujours finir avec la même exception. Également essayé "TimeZoneInfo.Local" mais cela donne l'erreur tout de suite.

Toute aide est très appréciée!

+0

Problème ajouté à GitHub https://github.com/chrisntr/Newtonsoft.Json/issues/issue/5 –

Répondre

2

C'était un bug dans MonoTouch.

Sous le simulateur iOS, il était possible de réutiliser les fichiers contenant les données de fuseau horaire (c'est-à-dire comme tout système de type UNIX). Toutefois, ces fichiers ne sont pas accessibles à partir d'un appareil iOS, conduisant à la TimeZoneNotFoundException.

Les versions récentes de MonoTouch (5.1.x iirc) s'initialisent à partir des données NSTimeZone. Ainsi, le .NET TimeZoneInfo aura des données qui correspondent, quelle que soit la version d'iOS, à ce que le périphérique fournit.

+0

Merci! Je vais jeter un oeil à NSTimeZone et cette méthode ressemblait à ce dont j'avais besoin: NSTimeZone.LocalTimeZone.GetSecondsFromGMT() –

1

Avoir le même problème, même si le mien provient au moment où Newtonsoft.Json tente de sérialiser un DateTime (et veut obtenir le décalage UTC.) La trace de la pile indique qu'elle appelle TimeZoneInfo.Local, qui déclenche une exception sur l'appareil (mais pas l'émulateur.)

1

Je viens de trouver une solution de contournement. Je devais recompiler le JSON newtonsoft avec les modifications suivantes aux DateTimeUtils.cs

Changer la fonction GetLocalOffset (ce DateTime d) d'utiliser simplement utcOffset = TimeZoneInfo.Local.GetUtcOffset (d);

au lieu de TimeZone.Local

+0

J'ai abandonné et implémenté une solution de contournement pour cela dans mon propre code. Des problèmes comme celui-ci me posent des questions à propos de MonoTouch, mais je suppose que je pourrais toujours avoir écrit des liens avec objectif-c. –

+0

Désolé, je n'ai jamais vu ce * vieux * post avant de m'avoir tweeté. Veuillez ne jamais hésiter à ouvrir un rapport de bug lorsque vous rencontrez des plantages ou des comportements différents entre le simulateur et les périphériques -> http://bugzilla.xamarin.com – poupou

1

J'ai eu le même problème avec le dispositif construit. Je l'ai résolu en mettant cet attribut (côté mobile). La sérialisation fonctionne très bien maintenant. [JsonConverter (typeof (IsoDateTimeConverter))]
public DateHeure? MyEndTime {get; ensemble; }

Profitez-en!

+0

Désolé, copier/coller depuis MonoDevelop ne donne pas de joli formatage. Huer. – HatAndBeard