J'ai un moment maintenant:
new Date();
Et j'ai quelques constantes sur l'heure, par exemple, 23 et 8 (il est 23h ou 23h, 8h ou 8h). Comment puis-je savoir si le temps entre deux constantes est maintenant?
Il doit exécuter un code de programme ou ne pas s'exécuter si le temps est maintenant dans deux heures, par exemple, n'exécutez pas de code s'il est déjà soir et qu'il n'est pas un matin.
Voici l'image pour mieux expliquer:
Certaines situations où le mode silencieux ne se déclenche pas:
00:00 20.06.13 - 23:00 20.06.13 // after 23.00 can loud!!
23:00 20.06.13 - 15:00 20.06.13 // after 15.00 can loud!!
01:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
21:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
essaye ça
int from = 2300;
int to = 800;
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
Calendar cal = Calendar.getInstance(); //Create Calendar-Object
cal.setTime(new Date()); //Set the Calendar to now
int hour = cal.get(Calendar.HOUR_OF_DAY); //Get the hour from the calendar
if(hour <= 23 && hour >= 8) // Check if hour is between 8 am and 11pm
{
// do whatever you want
}
La méthode moderne consiste à utiliser les classes Java.time intégrées à Java 8 et versions ultérieures. Une grande partie des fonctionnalités sont rétro-portées vers Java 6 et 7 dans le projet ThreeTen-Backport, puis adaptées à Android dans le projet ThreeTenABP.
Le fuseau horaire est crucial ici. A tout moment, la date et l'heure varient d'une zone à l'autre du monde.
ZoneId z = ZoneId.of( "America/Montreal" );
Obtenez votre moment actuel.
ZonedDateTime zdt = ZonedDateTime.now( z );
Extrait l'heure du jour. La partie Local
du nom signifie qu'il y a non concept de fuseau horaire contenu dans l'objet.
LocalTime lt = zdt.toLocalTime();
Définir les limites de la soirée.
LocalTime start = LocalTime.of( 23 , 0 ); // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 ); // 8 AM.
Comparer.
Nous devons déterminer si nous chevauchons un jour nouveau ou dans la même journée. Un LocalTime
n'a pas de concept de date, mais un seul jour générique de 24 heures. Nous devons donc vérifier si le début est avant ou après l’arrêt, car nous avons besoin d’un algorithme de comparaison différent pour chaque cas. Et nous devrions considérer si le début égal l'arrêt, car cela peut être un cas particulier en fonction de vos règles commerciales.
Dans le travail date-heure, nous définissons généralement les périodes de temps comme semi-ouvertes, où le début est inclus alors que la fin est exclusif.
Voici une façon de le faire.
Boolean silentRunning = null ;
if( start.equals( stop ) ) {
silentRunning = Boolean.FALSE ;
} else if( stop.isAfter( start ) ) { // Example 3 PM to 6 PM.
silentRunning = ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ;
} else if ( stop.isBefore( start ) ) { // Example 11 PM to 8 AM.
silentRunning = ( lt.equals( start ) || lt.isAfter( start ) ) && lt.isBefore( stop ) ;
} else {
// Error. Should not reach this point. Paranoid check.
}
La structure Java.time est intégrée à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes legacy telles que Java.util.Date
, Calendar
, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes Java.time .
Pour en savoir plus, voir le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes Java.time?
UPDATE: Ce qui précède est une version ultérieure de cette réponse. Ci-dessous est l'ancien.
La bibliothèque Joda-Time est largement supérieure aux classes Java.util.Date et .Calendar pour le travail date-heure.
Le fuseau horaire est crucial pour déterminer l'heure du jour. Il est évident que "maintenant" est plus tard dans la journée à Paris que Montréal.
Il est généralement préférable de définir une plage de temps comme étant à moitié ouvert, [)
, où le début est inclusif mais la fin est exclusive.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23 ) && ( hour < 8 ) );
Je pense que cette solution est plus propre et que cela fonctionne. Je l'ai testé avec différents paramètres de temps.
/**
* @param fromHour Start Time
* @param toHour Stop Time
* @param now Current Time
* @return true if Current Time is between fromHour and toHour
*/
boolean isTimeBetweenTwoHours(int fromHour, int toHour, Calendar now) {
//Start Time
Calendar from = Calendar.getInstance();
from.set(Calendar.HOUR_OF_DAY, fromHour);
from.set(Calendar.MINUTE, 0);
//Stop Time
Calendar to = Calendar.getInstance();
to.set(Calendar.HOUR_OF_DAY, toHour);
to.set(Calendar.MINUTE, 0);
if(to.before(from)) {
if (now.after(to)) to.add(Calendar.DATE, 1);
else from.add(Calendar.DATE, -1);
}
return now.after(from) && now.before(to);
}
Vous pouvez voir un tutoriel ici avec Date.before
et vous pouvez le faire avec Date.after
Aussi, vous pouvez obtenir ses millisecondes et le comparer.
voici une fonction qui vérifie que (l’heure actuelle) est comprise entre 1 à 4 OU 4 à 8 OU 8 à 12 OU 12 à 16 OU 16 à 20 OU 20 à 1 Et revient à la prochaine heure d'accumulation.
private Calendar GetTimeDiff() throws ParseException {
Calendar now = Calendar.getInstance();
Calendar one = Calendar.getInstance();
one.set(Calendar.HOUR_OF_DAY, 1);
one.set(Calendar.MINUTE, 0);
one.set(Calendar.SECOND, 0);
Calendar four = Calendar.getInstance();
four.set(Calendar.HOUR_OF_DAY, 4);
four.set(Calendar.MINUTE, 0);
four.set(Calendar.SECOND, 0);
Calendar eight = Calendar.getInstance();
eight.set(Calendar.HOUR_OF_DAY, 8);
eight.set(Calendar.MINUTE, 0);
eight.set(Calendar.SECOND, 0);
Calendar twelve = Calendar.getInstance();
twelve.set(Calendar.HOUR_OF_DAY, 12);
twelve.set(Calendar.MINUTE, 0);
twelve.set(Calendar.SECOND, 0);
Calendar sixteen = Calendar.getInstance();
sixteen.set(Calendar.HOUR_OF_DAY, 16);
sixteen.set(Calendar.MINUTE, 0);
sixteen.set(Calendar.SECOND, 0);
Calendar twenty = Calendar.getInstance();
twenty.set(Calendar.HOUR_OF_DAY, 20);
twenty.set(Calendar.MINUTE, 0);
twenty.set(Calendar.SECOND, 0);
if(now.getTime().after(one.getTime()) && now.getTime().before(four.getTime())) {
return four;
}
if(now.getTime().after(four.getTime()) && now.getTime().before(eight.getTime())) {
return eight;
}
if(now.getTime().after(eight.getTime()) && now.getTime().before(twelve.getTime())) {
return twelve;
}
if(now.getTime().after(twelve.getTime()) && now.getTime().before(sixteen.getTime())) {
return sixteen;
}
if(now.getTime().after(sixteen.getTime()) && now.getTime().before(twenty.getTime())) {
return twenty;
}
if(now.getTime().after(twenty.getTime()) && now.getTime().before(one.getTime())) {
return one;
}
return now;
}