2016-09-15 1 views
0

J'ai défini firstTime comme étant 15h35 aujourd'hui, mais une fois par jour. Mais quand je commence l'application aujourd'hui même après 15h35, il commence la tâche immédiatement. Je ne veux pas ça.Timer.schedule api: Pourquoi la tâche timer est-elle exécutée même si la première fois est passée?

public void scheduleTimerTask() { 

     int taskStartTimeInSec = 56100; 
     Timer timer = new Timer(); 
     Calendar today = Calendar.getInstance(); 
     today.set(Calendar.HOUR_OF_DAY, 0); 
     today.set(Calendar.MINUTE, 0); 
     today.set(Calendar.SECOND, taskStartTimeInSec); 
     Date firstTime = today.getTime(); 
     System.out.println("firstTime is : "+ firstTime); 
      timer.schedule(new Task(), firstTime, 
         1000*60*60*24); 
    } 

    class Task extends TimerTask{ 

     @Override 
     public void run() { 
      System.out.println("Thread Invoked at "+ new Date()); 

     } 

    } 

    public static void main(String[] args) throws ParseException { 
     Test t = new Test(); 
     t.scheduleTimerTask(); 
     } 


    Output : 
    firstTime is : Thu Sep 15 15:35:00 IST 2016 
    Thread Invoked at Thu Sep 15 18:33:35 IST 2016 

Je veux que si je commence plus tard (peut-être à 16h00), puis aujourd'hui la tâche ne doit pas exécuter, mais il doit exécuter demain à 15h35. Parce qu'aujourd'hui le temps de 15h35 est passé.

veuillez nous aider.

+0

Vous ne devriez pas utiliser 'set (Calendar.SECOND, taskStartTimeInSec)' comme ça. La valeur pour SECOND est censée être la seconde d'une minute, donc dans 0-59 –

+0

Calendrier j'utilise juste pour obtenir la date du jour. Cela fonctionne bien. Vous pouvez voir la date du jour avec l'heure en secondes spécifiée. Vérifiez la sortie firstTime is: Thu Sep 15 15:35:00 IST 2016. Plus de 59 secondes de valeur fera avancer l'horloge en minutes, heures et ainsi de suite. par exemple 15 * 3600 + 35 * 60 = 56100 entraînera la valeur de l'horloge comme 15:35:00 comme indiqué dans mon code. – Laxmikant

+0

Vous pouvez vérifier si firstTime est dans le passé, et si c'est le cas, ajoutez-y un jour avant la planification. –

Répondre

1

Comme par suggestion Gustav:

public void scheduleTimerTask() { 

     int taskStartTimeInSec = 56100; 
     Timer timer = new Timer(); 
     Calendar today = Calendar.getInstance(); 
     today.set(Calendar.HOUR_OF_DAY, 0); 
     today.set(Calendar.MINUTE, 0); 
     today.set(Calendar.SECOND, taskStartTimeInSec); 
     Date firstTime = today.getTime(); 
     if(firstTime.before(new Date())){ 
      today.add(Calendar.DATE, 1); 
      firstTime = today.getTime(); 
     } 
     System.out.println("firstTime is : "+ firstTime); 
      timer.schedule(new Task(), firstTime, 
         1000*60*60*24); 
    } 

Au-dessus a bien fonctionné. Maintenant, si la première fois est avant que j'ajoute un jour d'ici, il n'invoquera que le lendemain.

+0

N'hésitez pas à accepter votre propre solution si cela fonctionne :) –