Zeitumrechnung

SMoeller

Mitglied
Hallo,
ich hab ma wieder ein kleines Problem, aber nach 3 Stunden programmieren qualmt gerade mein Kopf un ich kann die einfachsten Sachen net mehr lösen. Also, ich SOLL mit System.currentTimeMillis() arbeiten und zwar soll ich da Zeit in Tage und Stunden umrechnen. Da mein Programm ein Simulationsprogramm ist, entspricht 1ms = 1s. Beim Start des Programms frage ich die Zeit ab und speichere diese in einer Variablen. Wenn dann 1Tag rum ist (86400s) zähle ich die Variable tage um eins hoch. Da ich aber nicht einfach so tage um eins hochzählen kann, wenn der Computer auf eine Eingabe wartet, frage ich die Zeit immer erst nach einer Eingabe ab. Die Zeit, die seit dem vergangenem Tag verstrichen ist, muss ich aber wieder zu den Stunden dazuzählen und da liegt irgendwie noch der Fehler. Wenn ein Tag vergangen ist, dann fangen die Stunden irgendwie bei -24 an. Ich stelle hier mal meinen Algorithmus rein, falls noch ein Programmabschnitt benötigt wird, einfach bescheid sagen.

Code:
public void pruefeZeit()
	{
		if (System.currentTimeMillis() - zeitStart >= 86400)
		{
			zeitStart = System.currentTimeMillis() + (System.currentTimeMillis() -    
                                        zeitStart);
			neuerTag();
		}
	}
	
    public int berechneStd()
    {
    	int std;
    	
    	zeitStop = System.currentTimeMillis() - zeitStart;
    	std = (int) zeitStop/3600;
    	
    	return std;
    }
 
Hallo,
Die Zeit, die seit dem vergangenem Tag verstrichen ist, muss ich aber wieder zu den Stunden dazuzählen und da liegt irgendwie noch der Fehler. Wenn ein Tag vergangen ist, dann fangen die Stunden irgendwie bei -24 an.

Ich kann zwar nicht mehr wirklich gute Mathe aber ich versuchs mal:
Java:
public void pruefeZeit() {
	long aktZeit = System.currentTimeMillis( );
	long delta = aktZeit - zeitStart;
	if (delta >= 86400) {
		// Seit wievielen sekunden läuft der neue Tag schon
		zeitUeberNeuerTag = delta - 86400;
		// Startzeit des neuen Tages entsprechend zurückrechnen
		zeitStart = aktZeit - zeitUeberNeuerTag;
		neuerTag( );
	}
}
 
Zuletzt bearbeitet:
Also, ich habe mein Proplem jetzt so gelöst:

Code:
public void pruefeZeit()
	{
		long delta = System.currentTimeMillis() - zeitStart; 
		
		if (delta >= 86400)
		{
			zeitStart = System.currentTimeMillis() + delta - 86400;
			neuerTag();
		}
	}
	
    public int berechneStd()
    {
    	int std;
    	
    	zeitStop = System.currentTimeMillis() - zeitStart;
    	std = (int) Math.abs(zeitStop/3600);
    	
    	return std;
    }

Das einzige, was jetzt noch nicht klappt, ist das Tage hochzählen, wenn mehrere Tage vergangen sind, wenn jemand Lust und Zeit hat, kann er das Problem gerne lösen, ich gönn mir jetzt erstmal eine Pause.
 
So sollte das auch über mehrere Tag gehen :)

Java:
public void pruefeZeit() {
	final int ONE_DAY = 86400;
	long aktZeit = System.currentTimeMillis( );
	long delta = aktZeit - zeitStart;
	if (delta >= ONE_DAY) {
		int days = (int)(delta / ONE_DAY);
		// Seit wievielen sekunden läuft der neue Tag schon
		zeitUeberNeuerTag = delta - (ONE_DAY * days);
		// Startzeit des neuen Tages entsprechend zurückrechnen
		zeitStart = aktZeit - zeitUeberNeuerTag;
		for(int i = 0; i < days; i++){
			neuerTag( );
		}
	}
}
 
Danke, für die schnelle Lösung, ich habe sie gerade in mein Programm eingebaut. Die Zeitumrechnung habe ich gebraucht, weil ich ein Tamagotchi programmiert habe, ich stelle mal den komplette Quellcode hier ins Forum, wenn noch jemand einen Verbesserungsvorschlag hat, kann er ihn ruhig posten.
PS. Ich habe noch keine JavaDoc Kommentare geschrieben, aber das sollte euch nicht stören.
Code:
public class Tamagotchi 
{
	private long zeitStart = System.currentTimeMillis();
	private long zeitStop = 0;
	private long zeitEssen = 0;
	private long zeitTrinken = 0;
	private long zeitSpielen = 0;
	private long zeitPflegen = 0;
	private int status = 4;
	private int lP = 30;
	private int tage = 0;
	private int essen = 0;
	private int trinken = 0;
	private int spielen = 0;
	private int pflegen = 0;
	
	private void neuerTag()
	{
		pruefeEssen();
	    pruefeTrinken();
	    pruefeSpielen();
	    pruefePflegen();
	    pruefeLP();
		essen = 0;
		trinken = 0;
		spielen = 0;
		pflegen = 0;
		zeitEssen = 0;
		zeitTrinken = 0;
		zeitSpielen = 0;
		zeitPflegen = 0;
	    tage += 1;
	    
	}
	
	public void setStatus(int i)
	{
		status = i;
	}
	
	public int setEssen()
	{
		essen += 1;
		zeitEssen = System.currentTimeMillis();
		status = 0;
		return status;
	}
	
	public int setTrinken()
	{
		trinken += 1;
		zeitTrinken = System.currentTimeMillis();
		status = 1;
		return status;
	}
	
	public int setSpielen()
	{
		spielen += 1;
		zeitSpielen = System.currentTimeMillis();
		status = 2;
		return status;
	}
	
	public int setPflegen()
	{
		pflegen += 1;
		zeitPflegen = System.currentTimeMillis();
		status = 3;
		return status;
	}
	
	public int getEssen()
	{
		return essen;
	}
	
	public int getTrinken()
	{
		return trinken;
	}
	
	public int getSpielen()
	{
		return spielen;
	}
	
	public int getPflegen()
	{
		return pflegen;
	}
	
	public long getZeitEssen()
	{
		return zeitEssen;
	}
	
	public long getZeitTrinken()
	{
		return zeitTrinken;
	}
	
	public long getZeitSpielen()
	{
		return zeitSpielen;
	}
	
	public long getZeitPflegen()
	{
		return zeitPflegen;
	}
	
	public int getLP()
	{
		return lP;
	}
	
	public int getStatus()
	{
		return status;
	}
	
	public int getTage()
	{
		return tage;
	}
	
	public void pruefeEssen()
	{
		if (essen == 0)
			lP -= 3;
		else if(essen == 1)
			lP -= 2;
		else if(essen == 2)
			lP -= 1;
		else if(essen == 3)
			lP -= 0;
		else if(essen == 4)
			lP -= 1;
		else if(essen == 5)
			lP -= 2;
		else if(essen >= 6)
			lP -= 3;
	}

	public void pruefeTrinken()
	{
		if (trinken == 0)
			lP -= 5;
		else if(trinken == 1)
			lP -= 4;
		else if(trinken == 2)
			lP -= 3;
		else if(trinken == 3)
			lP -= 2;
		else if(trinken == 4)
			lP -= 1;
		else if(trinken == 5)
			lP -= 0;
		else if(trinken >= 6)
			lP -= 1;
	}
	
	public void pruefeSpielen()
	{
		if (spielen == 0)
			lP -= 1;
		else if(spielen == 1)
			lP -= 0;
		else if(spielen == 2)
			lP += 1;
		else if(spielen == 3)
			lP += 1;
		else if(spielen == 4)
			lP += 1;
		else if(spielen == 5)
			lP += 1;
		else if(spielen >= 6)
			lP += 1;
	}
	
	public void pruefePflegen()
	{
		if (pflegen == 0)
			lP -= 1;
		else if(pflegen == 1)
			lP -= 0;
		else if(pflegen == 2)
			lP += 1;
		else if(pflegen >= 3)
			lP += 1;
	}
	
	public void pruefeLP()
	{
		if (lP >= 30)
			status = 4;
		else if (lP < 30 && lP >= 20)
			status = 5;
		else if (lP < 20 && lP >= 10)
			status = 6;
		else if (lP < 10 && lP >= 5)
			status = 7;
		else if (lP < 5 && lP >= 1)
			status = 8;
		else if (lP <= 0)
			status = 9;
	}

	public void pruefeZeit()
	{
		long delta = System.currentTimeMillis() - zeitStart; 
		
		if (delta >= 86400)
		{
			long aktZeit = System.currentTimeMillis();
			final int ONEDAY = 86400;
			int days = (int) (delta/ONEDAY);
			long zeitUeberTag;
			
			zeitUeberTag = delta - (ONEDAY * days);
			zeitStart = aktZeit - zeitUeberTag;
			
			for (int i=0; i<days; i++)
				neuerTag();
		}
	}
	
    public int berechneStd()
    {
    	int std;
    	
    	zeitStop = System.currentTimeMillis() - zeitStart;
    	std = (int) Math.abs(zeitStop/3600);
    	
    	return std;
    }
}

Code:
public class Tamatest 
{
	public static void main(String[] args)
	{
		Tamagotchi tama = new Tamagotchi();
		boolean wert = false;
		
		while (!wert)
		{
			String status = "";
			char c;
			
			tama.pruefeZeit();
			
			switch (tama.getStatus())
			{
				case 0: status = "Schmeckt net schlecht"; break;
				case 1: status = "Ein Bierchen am Morgen vertreibt Durst und Sorgen"; break;
				case 2: status = "I´m having fun"; break;
				case 3: status = "Jetz riech ich wieder ordentlich"; break;
				case 4: status = "Ich fühl mich wie der Hansi im MacDonalds"; break;
				case 5: status = "Mir gehts gut"; break;
				case 6: status = "Ich fühl mich nicht besonders gut"; break;
				case 7: status = "Ich muss unbedingt weg von dir, du Tamagotchiquäler"; break;
				case 8: status = "DU BRINGST MICH UM"; break;
				case 9: status = "TTTTTTTTTTTTOOOOOOOOOOOOOOOTTTTTTTTTTTTTTTTT"; wert = true; break;
				case 10: status = "Ich habe keinen Hunger"; break;
				case 11: status = "Ich habe keinen Durst"; break;
				case 12: status = "Ich habe keine Lust zu spielen"; break;
				case 13: status = "Ich habe mich erst gewaschen"; break;
			}
			
			if (!status.equals("TTTTTTTTTTTTOOOOOOOOOOOOOOOTTTTTTTTTTTTTTTTT"))
			{
				System.out.println("Lebenspunkte: " + tama.getLP() + '\n' +
								   "Status		: " + status + '\n' + 
								   "Zeit		: " + " Tage: " + tama.getTage() + " Std.: " + tama.berechneStd());
				
				System.out.println();
				
				System.out.println("Das habe ich heute schon bekommen: " + '\n' + 
								   "Essen   : " + tama.getEssen() + '\n' + 
								   "Trinken : " + tama.getTrinken() + '\n' + 
								   "Spielen : " + tama.getSpielen() + '\n' + 
								   "Pflegen : " + tama.getPflegen());
				
				System.out.println();
				
				System.out.println("Sie können nun folgendes wählen: " + '\n' + 
								   "Essen   : e" + '\n' + 
								   "Trinken : t" + '\n' + 
								   "Spielen : s" + '\n' + 
								   "Pflegen : p");
				
				c  = Konsole.readChar("Bitte geben sie hier den entsprechenden Buchstaben ein: ");
				
				switch (c)
				{
					case 'e': if (System.currentTimeMillis() - tama.getZeitEssen() <= 10800)
								tama.setStatus(10); 
							  else
							  	tama.setEssen(); break;
					case 't': if (System.currentTimeMillis() - tama.getZeitTrinken() <= 10800)
								tama.setStatus(11);
							  else
							  	tama.setTrinken(); break;
					case 's': if (System.currentTimeMillis() - tama.getZeitSpielen() <= 10800)
						        tama.setStatus(12);
							  else
							  	tama.setSpielen(); break;
					case 'p': if (System.currentTimeMillis() - tama.getZeitPflegen() <= 10800)
								tama.setStatus(13);
							  else
							  	tama.setPflegen(); break;
					default: System.out.println("Sie haben einen falschen Buchstaben eingegeben."); break;
				}
				System.out.println();
				System.out.println();
				System.out.println();
				
			}
			
		}
		System.out.println("Sie haben das Tamagotchi sterben lassen, der Computer wird sich gleich mit Ihnen in den Tot stürzen.");
	}
}
 
Zurück