Je travaille sur une fonctionnalité d'alarme et j'utilise Joda pour calculer les millis pour chaque heure d'alarme. J'ai quelques méthodes utilitaires, comme:Joda - la bonne façon d'obtenir l'heure d'été des heures indépendantes
public static DateTime getNextDateTimeWithHourMinute(int hour, int minute) {
DateTime now = new DateTime();
DateTime then = now
.withHourOfDay(hour)
.withMinuteOfHour(minute)
.withSecondOfMinute(0)
.withMillisOfSecond(0);
return then.isBefore(now) ? then.plusDays(1) : then;
}
qui calcule la prochaine occurence de quelques heures et minutes pour moi. Le problème est, si nous essayons d'obtenir, par exemple, 2h00 qui 10 Mars, nous aurons un
java.lang.IllegalArgumentException: instantanée illégale en raison du fuseau horaire de transition offset: 2013 -03-10T07: 00: 00,000
Je sais que dans ce cas, que le temps n'existe pas simplement, mais est-il un moyen simple de déterminer qu'entre il y a une transition entre survenant now
et then
puis automatiquement faire des corrections. Évidemment, les corrections dépendent de votre cas d'utilisation. Dans mon cas, je voudrais que ce soit le cas si l'horloge est en retard entre maintenant et alors que je reçois un objet DateTime retardé d'une heure. En d'autres termes, si l'utilisateur règle une alarme pour 3 heures du matin, par exemple, puis que l'horloge recule à ce moment-là, l'alarme se déclenche lorsque l'horloge indique 3 heures du matin (ce qui est maintenant une heure plus tard). Désolé pour la diatribe, j'espère que cette question a du sens.
Vous utilisez le mauvais 'type' dans la bibliothèque - utilisez un [LocalTime] (http://joda-time.sourceforge.net/api-release/org/joda/time/LocalTime.html) ou [LocalDate] (http://joda-time.sourceforge.net/api-release/org/joda/time/LocalDate.html) à la place (en utilisant 'LocalTime.toDateTimeToday()' ou 'LocalDate.toDateTime()' ou ' DateTime.toLocalTime() 'ou quelque chose). Strictement parlant, une alarme ne devrait pas traiter de l'heure «exacte», de toute façon, en raison de l'heure d'été (et des fuseaux horaires) - vous devriez les construire à partir des valeurs «locales». Que devrait-il se passer si l'alarme se déclenche pendant l'heure «manquante»? –
Points forts @ Clockwork-Muse. Je vais regarder dans les types de commutation. Je ne sais pas comment cela va m'aider à raisonner/éviter ces types d'erreurs. Faire quelque chose comme 'LocalDate localDate = new LocalDate(). AvecMonthOfYear (3) .withDayOfMonth (10); LocalTime localTime = new LocalTime() .withHourOfDay (2); DateTime dateTime = localDate.toDateTime (localTime); 'entraînera toujours une erreur. – LuxuryMode
Construire un 'LocalDateTime()' et ensuite utiliser 'DateTimeZone.isLocalDateTimeGap (...)' devrait être capable de les trouver. En outre, 'DateTimeZone.getMillisKeepLocal (...)' semble être 'gap safe', en ce sens qu'il renvoie l'heure 'next available' pour un fuseau horaire à partir d'une valeur 'locale' donnée. –