# Countdown (Stunden bis Freitag)



## Dark Ranger (2. Mai 2007)

Hallo

Ich versuche gerade einen Countdown zu schreiben, der bis Freitag Abend 19:30 Uhr die Stunden runterzählt, allerdings weiß ich nun nicht so recht wie ich die Stunden, Minuten und Sekunden bis Freitag Abend ausgerechnet bekomme!

Hier mein bisheriger Code:

```
package countd;
import java.util.*;

public class Count {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calendar calendar = Calendar.getInstance();
		int hour = 0;
		int minute = 1;
		int second = 30;

		while (hour >= 0) {
			calendar.set(Calendar.HOUR, hour);
			while (minute >= 0) {
				calendar.set(Calendar.MINUTE, minute);
				while (second >= 0) {
					calendar.set(Calendar.SECOND, second);
					System.out.printf("%02d:%02d:%02d\n",calendar.get(calendar.HOUR),calendar.get(calendar.MINUTE),calendar.get(calendar.SECOND));
					try {
						Thread.sleep(1000L);
					} catch(InterruptedException _ex) {}
				second--;
				}
			minute--;
			second = 59;
			}
		hour--;
		minute = 59;
		}
		System.out.println("Bin Da");
	}

}
```


----------



## zeja (3. Mai 2007)

Also am besten benutzt du Joda Time und legst dir ein aktuelles DateTime Objekt an. Dann setzt du halt den Tag und Uhrzeit auf Freitag 19:30. Damit hast du dein Freitags Objekt. Wenn du die Stunden bis Freitag 19:30 haben willst nimmst du ein Aktuelles DateTime Objekt und das vom Freitag und steckst die beide in eine Duration. Die wandelst du mit toPeriod in eine Period um und kannst dann da die Stunden abfragen.


----------



## Dark Ranger (3. Mai 2007)

Muss ich mir das runterladen?

Und Duration?


----------



## Dark Ranger (4. Mai 2007)

Mhhh irgendwie will das alles bei mir nicht so recht klappen! Das ist echt mal blöd!


----------



## zerix (4. Mai 2007)

Hallo,

das ist vielleicht nicht die beste Lösung, aber es ist mal ein Beispiel wie man es machen könnte.


```
import java.util.Calendar;
import java.util.GregorianCalendar;


public class Test {
    public static void main(String[] args)
    {
      double time;
      int sec, min, hour, day, month, year;
      Calendar now = new GregorianCalendar();
      Calendar appoint = new GregorianCalendar(2009,Calendar.JUNE,5,19,30);
      
      time = appoint.getTimeInMillis()-now.getTimeInMillis();
      do{
        
        time = time /1000;
        sec = (int)time%60;
        time = time / 60;
        
        min = (int)time%60;
        time = time / 60;
        
        hour = (int)time%24;
        time = time / 24;
        
        day = (int)time;
        System.out.printf("Tage: %d; Zeit: %d:%d:%d\n",day,hour,min,sec);
        try
        {
          Thread.sleep(1000);
        }
        catch (InterruptedException e)
        {
          e.printStackTrace();
        }
        now = new GregorianCalendar();
        time = appoint.getTimeInMillis()-now.getTimeInMillis();

      }while(time >=0);
    }
}
```

MFG

zEriX


----------



## Dark Ranger (4. Mai 2007)

Okay, das funktioniert schonmal danke!

Werde auf deinen Code mal weiter aufbauen und mal schauen wie ich es mache dass er immer wieder den nächsten Freitag nimmt wenn der Countdown zuende ist ^^


----------



## Dark Ranger (10. Mai 2007)

So ich habe da nochmal ne Frage, wie könnte ich es anstellen, dass er immer wieder den nächsten Freitag nimmt, wenn die Zeit abgelaufen ist.

Ich habe erst gedacht ich könnte einfach dann ne Variable für den freitag anlegen und die immer um 7 nach oben zählen, aber dann muss ich ja irgendwann auch den Monat wechseln. Und dadurch muss ich wissen wieviele Tage der Monat hat usw.

Aber vielleicht kennt ja irgendwer eine einfachere Methode wie ich rausfinden kann was der nächste Freitag ist.


----------



## Thomas Darimont (10. Mai 2007)

Hallo,

also ich würde das wie zeja schon gesagt hat auch mit Joda time machen:

```
/**
 * 
 */
package de.tutorials;

import org.joda.time.DateTime;
import org.joda.time.Period;

/**
 * @author Tom
 * 
 */
public class CalculateHoursUntilNextFridayExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		DateTime today = new DateTime(
				//2007, 5, 11, 19, 30, 0, 1
				);
		DateTime nextFriday1930Candidate = today.weekOfWeekyear().toInterval()
				.getEnd().minusDays(3).withHourOfDay(19).withMinuteOfHour(30);

		DateTime nextFriday1930 = null;
		if (nextFriday1930Candidate.isAfter(today)) {
			nextFriday1930 = nextFriday1930Candidate;
		} else {
			nextFriday1930 = nextFriday1930Candidate.plusWeeks(1);
		}

		System.out.println(today + " " + today.dayOfWeek().getAsText());

		Period period = new Period(today, nextFriday1930);

		System.out.printf("Hours until next friday 19:30: %sd %sh %sm %ss\n",
				period.getDays(), period.getHours(), period.getMinutes(),
				period.getSeconds());
	}
}
```

Ausgabe:

```
2007-05-10T22:12:24.546+02:00 Donnerstag
Hours until next friday 19:30: 0d 21h 17m 35s
```

Wer heute noch mit dem Java Calendar API arbeitet ist selbst schuld...

Gruß Tom


----------



## Dark Ranger (10. Mai 2007)

Muss ich dafür etwas runterladen?


----------



## Thomas Darimont (10. Mai 2007)

Hallo,

... ja:
http://sourceforge.net/project/showfiles.php?group_id=97367

Zip entpacken und entsprechendes jar in den Classpath legen, fertig.

Gruß Tom


----------



## Dark Ranger (10. Mai 2007)

Ok das habe ich jetzt! Funktioniert auch alles sehr gut soweit

Jetzt muss ich nur noch ne Wochenende Funktion einbauen ^^ aber da muss ich mir erstmal ne abrruch bedingung für meine do-while schleife überlegen!


----------



## Dark Ranger (10. Mai 2007)

```
package countd;
import java.awt.*;
import java.text.*;
import javax.swing.*;
import org.joda.time.DateTime;
import org.joda.time.Period;

import java.awt.event.*;

public class Count {
	  static JFrame fCount = new JFrame("Countdown");
	  static JLabel lCount = new JLabel();
	public static void main(String[] args) {
		  lCount.setBounds(0, 0, 400, 80);
		  fCount.getContentPane().add(lCount);
			Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
			fCount.setLocation( (d.width - fCount.getSize().width ) / 2, 
			               (d.height- fCount.getSize().height) / 2 );
		  fCount.setDefaultCloseOperation(fCount.EXIT_ON_CLOSE);
		  	fCount.addKeyListener(new KeyListener()
			{
				public void keyPressed(KeyEvent event) {}
				public void keyReleased(KeyEvent event) {
					if (event.getKeyChar() == KeyEvent.VK_ESCAPE)
					{
						System.exit(0);
					}
				}
				public void keyTyped(KeyEvent event) {}
			}
			);
		  	fCount.setUndecorated(true);
        lCount.setFont(new Font("Comic Sans MS",Font.BOLD,72));
  		lCount.setHorizontalAlignment(SwingConstants.CENTER);
  		lCount.setBackground(Color.RED);
  		lCount.setForeground(Color.WHITE);
  		lCount.setOpaque(true);
  		while(true)
  		{
		countdown();
		weekend();
  		}
    }
	
	public static void countdown()
	{
		  	String output;
		  	DecimalFormat df = new DecimalFormat("00");
	      	Period extern_period;
	        do
	        {
	        DateTime today = new DateTime();
	        DateTime nextFriday1930 = today.weekOfWeekyear().toInterval().getEnd()
	                .minusDays(3).withHourOfDay(19).withMinuteOfHour(30);
	 
	        Period period = new Period(today, nextFriday1930);
	        extern_period = period;
	        output = "Zeit: "+df.format(period.getHours())+":"+df.format(period.getMinutes())+":"+df.format(period.getSeconds())+"\n";
	        lCount.setText(output);
	        fCount.pack();
	        fCount.show();
			Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
	  		fCount.setLocation( (d.width - fCount.getSize().width ) / 2, 
	  	               (d.height- fCount.getSize().height) / 2 );
	        try
	        {
	        	Thread.sleep(1000);
	        }
	        catch (InterruptedException e)
	        {
	        	e.printStackTrace();
	        }
	        }while(extern_period.getHours() >= 0 & extern_period.getMinutes() >= 0 & extern_period.getSeconds() >= 0);
	}
	
	public static void weekend()
	{
	  	String output;
		Period extern_period;
		do
		{
	        DateTime today = new DateTime();
	        DateTime nextFriday1930 = today.weekOfWeekyear().toInterval().getEnd();
	 
	        Period period = new Period(today, nextFriday1930);
	        extern_period = period;
	        output = "Wochenende";
	        lCount.setText(output);
			Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
	  		fCount.setLocation( (d.width - fCount.getSize().width ) / 2, 
	  	               (d.height- fCount.getSize().height) / 2 );
	        try
	        {
	        	Thread.sleep(10000);
	        }
	        catch (InterruptedException e)
	        {
	        	e.printStackTrace();
	        }
		} while(extern_period.getHours() >= 0 & extern_period.getMinutes() >= 0 & extern_period.getSeconds() >= 0);
	}
}
```

So das ist mein Code, den kann man bestimmt noch um einiges verbessern! ^^ Aber ich denke er erfüllt seinen Zweck oder? Zumindestens haben meine kleinen Tests das ergeben ^^
Will jetzt nur noch einbauen, dass er am Sonntag 16.30 wieder anfängt bis zum nächsten Freitag zu zählen, aber da brauche ich ja ne übergangsfunktion, weil ich ja erst am Montag wieder zu meiner normalen Funktion changen kann! ^^


----------



## Thomas Darimont (10. Mai 2007)

Hallo,

schau dir mal wieder mein Posting an...

Gruß Tom


----------



## Dark Ranger (10. Mai 2007)

Mhhh, muss ich dann die Tage noch mitangeben? Oder kann ich das auch direkt in den Stunden ausgeben?

Edit: Habe deinen Code mal kopiert und bei mir eingefügt, allerdings funktioniert er bei mir nicht, er gibt trotzdem nur die Stunden bis morgen aus!


```
DateTime today = new DateTime();
	        DateTime nextbridge = today.weekOfWeekyear().toInterval().getEnd();
	        DateTime nextFriday1930Candidate = today.weekOfWeekyear().toInterval()
	                        .getEnd().minusDays(3).withHourOfDay(19).withMinuteOfHour(30);
	                DateTime nextFriday1930 = null;
	                if (nextFriday1930Candidate.isAfter(today)) {
	                    nextFriday1930 = nextFriday1930Candidate;
	                } else {
	                    nextFriday1930 = nextFriday1930Candidate.plusWeeks(1);
	                }
	        Period period = new Period(today, nextFriday1930);
	        Period bridge = new Period(today, nextbridge);
	        extern_period = bridge;
	        if (period.getHours() >= 100)
	        	output = "Bridge: "+trio.format(period.getHours())+":"+duo.format(period.getMinutes())+":"+duo.format(period.getSeconds())+"\n";
	        else
	        	output = "Bridge: "+duo.format(period.getHours())+":"+duo.format(period.getMinutes())+":"+duo.format(period.getSeconds())+"\n";
	        lCount.setText(output);
```

So habe ich das in meinen Code eingebaut! ^^


----------



## Dark Ranger (14. Mai 2007)

Es funktioniert so nicht, keine Ahnung warum er die Woche nicht dazu zählt


----------



## Dark Ranger (14. Mai 2007)

Er rechnet es einfach nicht bis zur nächsten Woche, hat irgendwer eine Lösung?

Edit:
Vergesst es, habe einfach nur nen Fehler in der Umrechnung gehabt ich Idiot ^^

Edit2:
Jetzt muss ich das ganze nur noch so verpacken, dass ich den Wochentag und die Uhrzeit einstellen kann, aber da habe ich mal wieder keine Idee


----------

