8
votes

Problème TimeZone avec UidatePicker Date: 1 heure incorrecte

J'ai un problème avec le MonoTouch UidatePicker étant 1 heure de retard. Je pense que c'est à faire avec des fuseaux horaires ou quelque chose de similaire. J'ai essayé de définir explicitement le fuseau horaire et les paramètres régionaux de mon UidatePicker, mais cela ne semble pas aider. XXX PRE>

dans le gestionnaire ValueChageed, la ligne suivante retourne une valeur 1 heure plus tôt que le temps Sélectionné dans l'interface utilisateur: P>

datePicker.Locale.LocaleIdentifier;
datePicker.DatePicker.TimeZone;


1 commentaires

Est-il possible que l'épargne de la lumière du jour soit en vigueur? Cela peut parfois causer des différences d'heures similaires à ce que vous semblez ressentir.


3 Réponses :


2
votes

Après var date = DateTime ... , ajoutez ce qui suit: XXX


5 commentaires

Le temps d'épargne du jour n'est pas toujours ajusté d'une heure. Timeanddate.com/Time/dst Infiniteundo.com/post/25509354022/...


En effet. C'est une solution rapide. Je préfère être presque correct que complètement faux, pour ainsi dire. Vous pouvez bien sûr utiliser un décalage de DST basé sur le fuseau horaire. Avez-vous une belle proposition pour cela? J'aime le deuxième lien, mais cela ne donne aucune réponse; seulement indique que nous portons des idées fausses.


La réponse est dans ma réponse ci-dessous. Utilisez DateFormatter, il s'occupe de DST pour vous.


Oui, mais seulement lors de la sortie de texte


TimeZoneInfo.ConvertiTimeFromutc retourne DateTime.



2
votes

Ce code magique corrige tous mes problèmes avec des économies de jour et des fuseaux horaires. Ecrivez si vous avez besoin d'aide.

NSDate sourceDate = date;

NSTimeZone sourceTimeZone = new NSTimeZone ("UTC");
NSTimeZone destinationTimeZone = NSTimeZone.LocalTimeZone;

int sourceGMTOffset = sourceTimeZone.SecondsFromGMT (sourceDate);
int destinationGMTOffset = destinationTimeZone.SecondsFromGMT (sourceDate);
int interval = destinationGMTOffset - sourceGMTOffset;

var destinationDate = sourceDate.AddSeconds (interval);

var dateTime = new DateTime(2001, 1, 1, 0, 0,0).AddSeconds(destinationDate.SecondsSinceReferenceDate);

DescriptionLabel.Text = dateTime.ToString ("dd.MM.yyyy. HH:mm");
this.date = destinationDate;


1 commentaires

Ce code ajoute une complexité inutile. Si vous souhaitez convertir du temps à votre fuseau horaire local, utilisez simplement DateTime.TolocalTime ().



12
votes

La date renvoyée de DatePicker est au format UTC. Il existe plusieurs méthodes de conversion de l'UTC en temps local. Comme Ce Réponse State Tolocaltime est le meilleur.

DateTime.SpecifyKind(datePicker.Date, DateTimeKind.Utc).ToLocalTime();


2 commentaires

Je pense que c'est la bonne réponse. Dans le code d'origine, l'OP spécifié denttitimekind.local au lieu de denttimekind.utc . Étant donné qu'un nsdate représente UTC mais la conversion ne définit pas le .Kind , voici comment vous devez le faire.


Mais DatePicker.date est un nsdate et le premier paramètre de la méthode DateTime.SpecifyKind est une date de données ...