J'essaie de créer une fonction que je souhaite ne travailler qu'entre un moment donné.

C'est-à-dire: si startTime est "13:00" et endTime est "14:00", alors chaque jour lorsque l'utilisateur utilise mon application à / entre cette heure, appelez la fonction, sinon ne faites rien.

Voici ce que je suis tombé sur en essayant de comprendre mais cela ne fonctionne pas.


 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.UK);

       try {
           Date inTime = sdf.parse("13:00");
           Date outTime = sdf.parse("14:00");
           if (outTime != null) {
               if (isTimeAfter(inTime, outTime)) {
                   Toast.makeText(SplashScreenActivity.this, "Time validation success", Toast.LENGTH_LONG).show();
               }
               else {
                   Toast.makeText(SplashScreenActivity.this, "Exit time must be greater then entry time", Toast.LENGTH_LONG).show();
               }
           }
       } catch (ParseException e) {
           e.printStackTrace();
           Toast.makeText(SplashScreenActivity.this, "Parse error", Toast.LENGTH_LONG).show();
       }


public static boolean isTimeAfter(Date startTime, Date endTime) {
       return !endTime.before(startTime);
   }

Toute aide est la bienvenue, merci!

MISE À JOUR 1 :

 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.UK);
       Date now = new Date(System.currentTimeMillis());

       try {
           Date inTime = sdf.parse("03:19");
           Date outTime = sdf.parse("03:21");

           if (now.after(inTime) && now.before(outTime)) {
               Toast.makeText(SplashScreenActivity.this, "Time validation success", Toast.LENGTH_LONG).show();
           } else {
               Toast.makeText(SplashScreenActivity.this, "Nope, it isn't wokring", Toast.LENGTH_LONG).show();
           }
       } catch (ParseException e) {
           e.printStackTrace();
           Toast.makeText(SplashScreenActivity.this, "Parse error", Toast.LENGTH_LONG).show();
       }
2
Steven Rõgrê 24 févr. 2021 à 23:52

2 réponses

Meilleure réponse

Tl; dr

LocalTime start = null ;
LocalTime end = null ;
try
{
    start = LocalTime.parse( "03:19" ) ;
    end = LocalTime.parse( "03:21" ) ;
} 
catch ( DateTimeParseException e ) 
{
    … handle faulty input
}

LocalTime currentTimeOfDay = LocalTime.now( ZoneId.systemDefault() ) ;
if( 
    ( ! currentTimeOfDay.isBefore( start ) )   // "Is not before …" is a briefer way of asking "Is equal to or later than …".
    &&
    currentTimeOfDay.isBefore( end )
)
{ … within target times }
else
{ … outside target times }

Arrêtez d'utiliser Date et SimpleDateFormat

La Réponse de Yoni est sur le point d'être la bonne solution, mais continue votre confusion en utilisant la classe java.util.Date. N'utilisez jamais java.util.Date , arrêtez-vous, laissez tomber, passez à autre chose.

Ces classes de date-heure héritées sont un désordre misérable. Sun, Oracle et la communauté JCP les ont abandonnés il y a des années avec l'adoption de JSR 310. Vous devriez donc.

Tu as dit:

c'est-à-dire: si startTime est "13:00" et endTime est "14:00", alors chaque jour lorsque l'utilisateur utilise mon application à / entre cette heure, appelez la fonction, sinon ne faites rien.

LocalTime

Représentez vos heures de début et de fin.

LocalTime start = LocalTime.of( 13 , 0 ) ;
LocalTime end = LocalTime.of( 14 , 0 ) ;

Capturez le moment actuel comme vu dans un fuseau horaire particulier.

ZoneId

Vous pouvez supposer que l’utilisateur souhaite utiliser le fuseau horaire par défaut de la machine virtuelle Java.

ZoneId zoneId = ZoneId.systemDefault() ;

S'il est critique, vous devez confirmer avec l'utilisateur le fuseau horaire prévu. Spécifiez un nom de fuseau horaire réel en utilisant le format Continent/Region, jamais le 2-4 pseudo-zones de lettres telles que IST, EST, PST, etc.

ZoneId zoneId = ZoneId.of( "America/Edmonton" ) ;

ZonedDateTime

Une fois le problème du fuseau horaire décidé, capturez le moment actuel tel qu'il est vu dans ce fuseau.

ZonedDateTime now = ZonedDateTime.now( zoneId ) ;

Extrayez la valeur de l'heure à partir de ce moment.

LocalTime currentTimeOfDay = now.toLocalTime() ;

Comparer LocalTime objets

Comparez avec votre cible de début.

Il est généralement préférable de définir les intervalles de temps en utilisant l'approche semi-ouverte, où le début est inclusif tandis que la fin est exclusive .

if( 
    ( ! currentTimeOfDay.isBefore( start ) )   // "Is not before …" is a briefer way of asking "Is equal to or later than …".
    &&
    currentTimeOfDay.isBefore( end )
)
{ … within target times }
else
{ … outside target times }

Analyse

Si vous devez obtenir vos valeurs d'heure de début et de fin en analysant du texte au format ISO 8601 standard où l'heure correspond à une horloge de 24 heures (0-23) et des zéros de remplissage sont utilisés, appelez simplement { {X0}} méthode. Pas besoin de spécifier un modèle de formatage. Pas besoin de spécifier un Locale.

LocalTime start = LocalTime.parse( "03:19" ) ;
LocalTime end = LocalTime.parse( "03:21" ) ;

Pour vous protéger contre les entrées défectueuses, trappe pour DateTimeParseException.

LocalTime start = null ;
LocalTime end = null ;
try
{
    start = LocalTime.parse( "03:19" ) ;
    end = LocalTime.parse( "03:21" ) ;
} 
catch ( DateTimeParseException e ) 
{
    … handle faulty input
}

2
Basil Bourque 24 févr. 2021 à 22:22

Le problème est que vous comparez vos 2 dates fixes. Vous vérifiez que 13h00 est après 14h00. Ce qui sera toujours vrai.

Ce à quoi vous voulez comparer est l'heure actuelle. Vous voulez que l'heure actuelle soit postérieure à l'heure de début et avant l'heure de fin.

Pour obtenir l'heure actuelle, vous pouvez utiliser new Date(System.currentTimeMillis()) et utilisez-le pour vos comparaisons avec l'heure de début et de fin

Cela vous donnerait quelque chose comme ceci:

Date now = new Date(System.currentTimeMillis());
now.after(startTime) && now.before(endTime);

Version Java 8+

Depuis java 8, il est également recommandé d'utiliser LocalTime au lieu de Date. Cela résout de nombreux problèmes que vous pourriez rencontrer avec les fuseaux horaires et autres.

Pour obtenir l'heure actuelle, vous pouvez utiliser LocalTime.now(). L'extrait de code ressemble à ceci alors

LocalTime now = LocalTime.now();
now.isAfter(startTime) && now.isBefore(endTime);
1
Yoni 24 févr. 2021 à 21:44