2017-10-19 23 views
0

Mon formulaire Xamarin pour iOS et Android utilise énormément le temps de l'appareil et nécessite une configuration différente selon les pays.Formulaire Xamarin: est-il sécuritaire d'utiliser le fuseau horaire répertorié à l'aide de GetSystemTimeZones?

je fais une recherche et a trouvé cela la liste de tous le fuseau horaire disponible:

foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones()) 
      Console.WriteLine(z.Id); 

Dans mon scénario, l'utilisateur peut choisir l'un des sites et définir le fuseau horaire approprié en fonction de l'endroit où leurs sites sont si le temps sera affiché par rapport à leur site choisi.

J'ai exécuté le code et au moins tout le fuseau horaire disponible. On dirait que l'iOS et Android ont une présentation différente de l'Id Timezone. Je suppose que c'est à cause du système différent. Je m'inquiète juste que l'id de timezone ne soit pas complètement énuméré coz notre application s'exécute internationalement, réellement la plupart d'exécution exécutée internationalement. Une autre remarque: le code ci-dessus prendra-t-il également en compte l'économie de lumière du jour? par exemple. En Nouvelle-Zélande, chaque année, la Nouvelle-Zélande doit avancer ou reculer d'une heure par rapport à d'autres pays.

+1

Vous pourriez vouloir regarder 'Noda Time' (http://nodatime.org), vous devriez également lire https://stackoverflow.com/a/2532962/4984832 – SushiHangover

+0

Expliquerez-vous le problème si vous utilisez le code ci-dessus au lieu de nodatime vous avez suggéré? Sur mon iOS, je change la date en mai qui recule d'une heure et affiche l'heure, le retour de l'heure est correct. Pour Oct (maintenant): 10:00 heure nz et 5:00 heure hk. Pour mai, 10:00 heure nz et 6:00 – LittleFunny

+0

Il n'est pas clair comment vous utilisez une heure UTC vs une heure convertie TZ locale (vous utilisez maintenant dans votre question et une heure UTC précédente dans votre commentaire) et les fuseaux horaires ne sont pas la même chose que les compensations. Si vous planifiez un événement "local", utilisez une heure locale qui inclut le décalage par rapport àUne heure UTC comme la différence dépend de quand il se produit dans le futur et la conversion d'un UTC à une heure locale peut entraîner une heure locale différente de celle initialement demandée. Relisez la réponse SO et les commentaires liés à ces sujets. (J'ai recommandé d'examiner Noda car il supprime cette confusion). – SushiHangover

Répondre

0

TimeZoneInfo.GetSystemTimeZones() fait exactement ce qu'il dit - obtient les fuseaux horaires disponibles sur le système sur lequel il s'exécute. En général, on ne peut pas supposer que tous les systèmes auront les mêmes fuseaux horaires installés. Il est un peu plus sûr de supposer que si tous les systèmes sont des ordinateurs de bureau Windows, cela dépendra si ces ordinateurs sont tenus à jour avec les derniers changements de fuseaux horaires (livrés via Windows Update et OS construit dans Windows 10) .

Dans un monde multiplate-forme, tous les paris sont désactivés. Vous pourriez obtenir des identifiants de fuseaux horaires Windows. Vous pouvez obtenir des ID de fuseau horaire IANA. Vous pourriez avoir autre chose.

Vous avez montré un exemple de "Hongkong". C'est en effet un alias valide à "Asia/Hong_Kong" dans la base de données de fuseau horaire de l'IANA. Donc, votre environnement donne probablement des ID de l'IANA. (Vous devriez cependant préférer "Asia/Hong_Kong".)

Si vous pensez avoir besoin de convertir les fuseaux horaires IANA et Windows, vous pouvez utiliser ma bibliothèque TimeZoneConverter. Cependant, dans votre cas, il semble qu'il serait beaucoup plus sûr d'utiliser Noda Time, car il regroupera les données de fuseau horaire avec votre application, plutôt que de compter sur le système d'exploitation pour fournir les données.

Oui, ce code gère correctement l'heure d'été. Pour la Nouvelle-Zélande, vous utiliseriez "Pacific/Auckland" pour l'ID de fuseau horaire de l'IANA. Toutefois, vous devez choisir soit TimeZoneInfo.Local.StandardName ou TimeZoneInfo.DaylightName en fonction du résultat TimeZoneInfo.IsDaylightSavingTime. Ou, si vous voulez des noms plus précis et localisés, vous pouvez utiliser ma bibliothèque TimeZoneNames.