# Algorithmen und Programmierung - Datum und Zeit ausgeben?



## easyJAVA? (13. Nov 2011)

Hallo liebe JAVA-Experten,

wir sind Studenten des Wirtschaftsingenieurwesen und verzweifeln von Woche zu Woche an 
unserem Lieblingsfach Algorithmen und Programmierung:lol:

Da wir unser Skript eigentlich direkt in die Tonne werfen können und die Internetrecherche i.d.R.
auch immer vergebens ist (warum machen die das so schwer?) hoffen wir von euch zu lernen
und Hilfestellung zu den Aufgaben zu bekommen, dass wir ein bisschen Licht in der großen Finsternis des Java-Programmierens bringen können :rtfm:

Wir programmieren in Eclipse (wobei Java=Java ist glaube ich) und die Aufgabenstellung ist wie folgt:

_"Die Unixzeit ist eine einfache Zeitdefinition, die 1969 f¨ur das Betriebssystem Unix entwickelt
und als POSIX-Standard festgelegt wurde. Seit Unix Version 6 z¨ahlt die Unixzeit
die vergangenen Sekunden seit dem 1. Januar 1970 00:00 Uhr UTC (koordinierte Weltzeit/
heute g¨ultigeWeltzeit). Die Differenz der Mitteleurop¨aischen Zeit (MEZ) zurWeltzeit
UTC betr¨agt +1 Stunde. (Quelle: Unixzeit ? Wikipedia)

Wandeln Sie eine gegebene Weltzeit in das entsprechende MEZ-Datum und die zugeh¨orige
Uhrzeit um.
Dazu m¨ussen Sie die Sekunden derWeltzeit in Minuten, Stunden, Tage, Monate und Jahre
umrechnen und den Beginn der UTC ber¨ucksichtigen. Beachten Sie auch, dass die einzelnen
Monate eine unterschiedliche Anzahl von Tagen haben. Damit die Aufgabe nicht zu
kompliziert wird, sollen Schaltjahre nicht beachtet werden, d. h. der Februar hat immer
28 Tage.
Zur Umrechnung der Zeiteinheiten f¨uhren Sie folgende Arbeitsschritte aus:
(a) Entwerfen Sie zun¨achst ein Struktogramm.
(b) Implementieren Sie dann den Algorithmus in Java.
Weisen Sie der Variablen UTC (Weltzeit) zu Beginn Ihres Programmes folgende
Werte zu: UTC1 = 5 000 000 Sekunden und UTC2 = 1 322 000 000
Geben Sie Ihre Ergebnisse in folgender Form aus: tt.mm.jjjj - hh:mm:ss"_

also was wir bisher versucht haben (Quelltext aus Eclipse):

public class Aufg1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int sek=1;
		int min=sek*60;
		int std=sek*3600;
		int tag=sek*86400;
		int monat31=sek*2678400;
		int monat30=sek*2592000;
		int monat28=sek*2419200;
		int jahr=sek*31536000;

		int utc1=sek*5000000;
		int utc2=sek*1322000000;
		int h=sek*0;

Wir haben uns dabei gedacht, dass wir jede Einheit (Jahre,Monate etc) in Sekunden festhalten müssen... Aber the big Problem: Wie soll das ganze nachher als Datum ausgegeben werden??

Soweit sind wir bisher gekommen und weiter wissen wir jetzt auch nicht mehr..

Kann da jemand helfen? Wir danken vielmals für etwaige Hilfe...


----------



## Xeonkryptos (13. Nov 2011)

```
private final DateFormat timeFormat = new SimpleDateFormat(
			"EEEE, d. MMMM yyyy - HH:mm 'Uhr'");
timeFormat.format(time.getTimeCreated())
```

Die Variable time ist ein long-Wert, der die Millisekunden von der Beginn der Zählung, also dem 1. Januar 1970 00:00 Uhr bis zum jetzigen Tag anspricht. Man kann natürlich mit dem Wert variieren. Es ist egal welcher Wert! Damit wird es umgerechnet.


----------



## easyJAVA? (13. Nov 2011)

Hallo,

vielen Dank für die Hilfe, aber leider hat uns das nicht weitergebracht.
(haben das bei uns reinkopiert, aber kamen nur Fehlermeldungen??)

haben uns allerdings weitere Überlegungen gemacht und ich denke wir sind auf dem richtigen Weg.
Der Quelltext sieht nun wie folgt aus:


```
public class Aufg1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		int sek=1;
		int min=sek*60;
		int std=sek*3600;
		int tag=sek*86400;
		int monat31=sek*2678400;
		int monat30=sek*2592000;
		int monat28=sek*2419200;
		int jahr=sek*31536000;
		
		int utc1=sek*5000000;
		int utc2=sek*1322000000;
		
		int a=utc1/jahr;
		int b=utc1%jahr;
		int newyear=1970+a;
		int c=b/monat31;
		int d=c%monat31;
		
		System.out.println(newyear);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
				
	
	}

}
```

das müsste doch so auch zu lösen sein? durch den Rest, den wir erhalten, teilen wir immer wieder die nächstkleinere Einheit, wobei wir ja jetzt bei den Monaten wieder auf ein Problem gestoßen sind,
da wir monate mit 31/30/28 Tagen haben..?

wie könnte man das lösen? dankeeee


----------



## Xeonkryptos (13. Nov 2011)

zählt die Anzahl der Monate mit 30/31/28 Tagen und zieht diese nach und nach von eurem Long ab. Der Rest der übrig bleibt, sind dann die Resttage des nächsten Monats.


----------



## easyJAVA? (13. Nov 2011)

hmmm ok, ehrlich gesagt verstehn wir das mit dem long überhaupt nicht... was das sein soll etc..

aber geht das mit unserem system nicht?


----------



## easyJAVA? (13. Nov 2011)

```
public class Aufg1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		int Sekunde = 1;
        int Minute = Sekunde*60;
        int Stunde = Sekunde*3600;
        int Tag = Sekunde*86400;
        int Monat28 = Sekunde*2419200;
        int Monat30 = Sekunde*2592000;
        int Monat31 = Sekunde*2678400;
        int Jahr = Sekunde*31536000;

        int UTC1 = Sekunde*5000000;
        int UTC2 = Sekunde*1322000000;

        int a = UTC1/Jahr;
        int b = UTC1%Jahr;
        int Jahrneu = 1970 + a;

        int [] monat = {2678400 , 2419200 , 2678400 , 2592000 , 2678400 , 2592000 , 2678400 , 2678400 , 2592000 , 2678400 , 2592000 , 2678400};
        //int c = b/Monat31;
            //if (c >= Monat30 || c>= Monat28) {c/Monat30 c%Monat30 c/Monat28 c%Monat28};
        //int d = b%Monat31;
        int m = 0;
        int c = b / monat[m];
        int d = b % monat[m];
        c++;

        int Monatnew = 0 + c;

        int e = d/Tag;
        int f = d%Tag;
        int Tagneu = 0 + e;

        int g = f/Stunde;
        int h = f%Stunde;
        int Stundeneu = 0 + g;

        int i = h/Minute;
        int j = h%Minute;
        int Minuteneu = 0 + i;

        int k = j/Sekunde;
        int l = j%Sekunde;
        int Sekundeneu = 0 + k;


        //System.out.println(a);
        //System.out.println(b);
        System.out.println(Jahrneu);
        //System.out.println(c);
        //System.out.println(d);
        System.out.println(Monatnew);
        System.out.println(Tagneu);
        System.out.println(Stundeneu);
        System.out.println(Minuteneu);
        System.out.println(Sekundeneu);

        private final DateFormat time Format= new SimpleDateFormat ("");
        timeFormat.format(time.getTimeCreated());

    }

}
```

so wir haben es jetzt geschafft, wir haben das gewünuschte Datum rausbekommen :applaus:

nur: Wie kriegen wir das mit dem Format hin?? 

@Xeonkryptos

kann das sein, das jetzt dein long da ins Spiel kommt?
Wenn ja, was haben wir bei uns im Quelltext falsch gemacht...? bzw. wie kommt das rein, weil wenn wir das so machen wie du, kommt da ne fehlermeldung..

Als Datum haben wir 26.02.1970 20:53:20 Uhr


----------



## Marcinek (13. Nov 2011)

easyJAVA? hat gesagt.:


> hmmm ok, ehrlich gesagt verstehn wir das mit dem long überhaupt nicht... was das sein soll etc..
> 
> aber geht das mit unserem system nicht?



Long ist ein Datentyp. :rtfm:

Er kann große ganzzahlen speichern.


----------



## easyJAVA? (13. Nov 2011)

```
public class Aufg1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		int Sekunde = 1;
        int Minute = Sekunde*60;
        int Stunde = Sekunde*3600;
        int Tag = Sekunde*86400;
        int Monat28 = Sekunde*2419200;
        int Monat30 = Sekunde*2592000;
        int Monat31 = Sekunde*2678400;
        int Jahr = Sekunde*31536000;

 //für UTC1
        int UTC1 = Sekunde*5000000;
        int UTC2 = Sekunde*1322000000;

        int a = UTC1/Jahr;
        int b = UTC1%Jahr;
        int Jahrneu = 1970 + a;

        int [] monat = {2678400 , 2419200 , 2678400 , 2592000 , 2678400 , 2592000 , 2678400 , 2678400 , 2592000 , 2678400 , 2592000 , 2678400};
        
         
        int m = 0;
        int c = b / monat[m];
        int d = b % monat[m];
        c++;

        int Monatneu = 0 + c;

        int e = d/Tag;
        int f = d%Tag;
        int Tagneu = 0 + e;

        int g = f/Stunde;
        int h = f%Stunde;
        int Stundeneu = 0 + g +1 ; // +1 Umrechnung von UTC auf MEZ

        int i = h/Minute;
        int j = h%Minute;
        int Minuteneu = 0 + i;

        int k = j/Sekunde;
        int l = j%Sekunde;
        int Sekundeneu = 0 + k;

 // für UTC2
        
        
        int a2 = UTC2/Jahr;
        int b2 = UTC2%Jahr;
        int Jahrneu2 = 1970 + a2;

        int [] monat2 = {2678400 , 2419200 , 2678400 , 2592000 , 2678400 , 2592000 , 2678400 , 2678400 , 2592000 , 2678400 , 2592000 , 2678400};
        
         
        int m2 = 0;
        int c2 = b2 / monat[m2];
        int d2 = b2 % monat[m2];
        c2++;

        int Monatneu2 = 0 + c2;

        int e2 = d2/Tag;
        int f2 = d2%Tag;
        int Tagneu2 = 0 + e2;

        int g2 = f2/Stunde;
        int h2 = f2%Stunde;
        int Stundeneu2 = 0 + g2 +1 ; // +1 Umrechnung von UTC auf MEZ

        int i2 = h2/Minute;
        int j2 = h2%Minute;
        int Minuteneu2 = 0 + i2;

        int k2 = j2/Sekunde;
        int l2 = j2%Sekunde;
        int Sekundeneu2 = 0 + k2;


        System.out.println(Tagneu + "." + Monatneu + "." + Jahrneu + " - " +Stundeneu + ":" + Minuteneu + ":"+ Sekundeneu + " Uhr" + " für UTC1 nach MEZ" );
        System.out.println(Tagneu2 + "." + Monatneu2 + "." + Jahrneu2 + " - " +Stundeneu2 + ":" + Minuteneu2 + ":"+ Sekundeneu2 + " Uhr" + " für UTC2 nach MEZ" );	
	}

}
```

wir habens jetzt raus, das ist das Ergebnis und es ist richtig....


----------



## Xeonkryptos (13. Nov 2011)

ich hab immer von long gesprochen, weil long ein Datentyp ist, der Zahlen von bis zu 3 Trillionen oder so, speichern kann und für die Angabe des Datums besser geeignet ist, da man Einheiten im Millisekunden-Bereich hat und diese irgendwann den Speicherplatz des int-Datentyps überspringen würden. Dann funktioniert euer Ansatz nicht mehr, außer ihr schreibt alles auf long um.

Außerdem habt ihr meinen Ansatz auch nicht richtig übernommen! Es ist wohl selbstverständlich, dass es bei euch nicht so hinhauen konnte! Vergleicht mal euren Ansatz (euer Codebeispiel) mit meinem (Codebeispiel). Ihr merkt sofort, da hab ich etwas anderst gemacht. Auf der Basis, dass ihr anstelle eines long-Variablen auch eine int-Variable dort einsetzen könnt. "time" war bei mir der Datentyp, der die Millisekunden enthält.


----------

