2013-02-12 1 views
0

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.

+0

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»? –

+0

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

+0

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. –

Répondre

1

Vous pouvez mentir avec vos dents à propos de la date et du fuseau horaire de votre alarme. Par exemple:

LocalDate localDate = new LocalDate().withMonthOfYear(3).withDayOfMonth(10); 
LocalTime localTime = new LocalTime().withHourOfDay(2); 
DateTime dateTime = localDate.toDateTime(localTime, DateTimeZone.UTC); 
DateTime dt = new DateTime(DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), dateTime.getMillis())); 

System.out.println(dateTime); 
System.out.println(dt); 

qui dans mon cas imprime:

2013-03-10T02:09:42.333Z 
2013-03-10T03:09:42.333-07:00 

(je vis à Washington)

Cependant, je pense qu'il est préférable d'utiliser quelque chose de l'ordre de:

DateTime.now().toLocalDateTime().isBefore(new LocalDateTime(2013, 3, 10, 2, 0)); 

Qui plus est, hermétiquement, sémantiquement correct.

+0

hehe, merci. Le DT, il pourrait y avoir exactement ce dont j'ai besoin! – LuxuryMode

+0

Que pensez-vous de la partie isBeforeNow?Qu'essayais-tu d'illustrer là? – LuxuryMode

+0

La partie '.isBefore()' me permet de dire: "Hey, est-ce que l'instant actuel est dans le temps (n'importe où sur la planète) avant cette combinaison arbitraire date/heure (qui ne reflète pas le fuseau horaire)? D'un point de vue conceptuel, c'est ce que vous avez réellement à faire: est-ce que cet instant est dans le temps, traduit par où je suis, avant une combinaison date/heure 'agnostique dans le fuseau horaire' que j'ai spécifiée? –

Questions connexes