web-dev-qa-db-fra.com

Comment savoir si le temps est maintenant entre deux heures?

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:

 enter image description here

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!!
14
Trancer

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);
24
Evgeniy Dorofeev
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
}
11
Holger

Java.time

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

À propos de Java.time

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? 

  • Java SE 8 et SE 9 et plus tard
    • Intégré. 
    • Partie de l'API Java standard avec une implémentation intégrée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android

UPDATE: Ce qui précède est une version ultérieure de cette réponse. Ci-dessous est l'ancien.

Joda-Time

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 ) );
4
Basil Bourque

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);
        }
3
sytolk

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.

2
user529543

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;
}
0
Dileep