# Aktuelles Datum speichern



## pozzitiv (22. Apr 2010)

Hi,

ich hab ein Problem zu verstehen, wie ich in Java aktuelles Datum speichern kann und dieses später wieder abrufen. Es geht nämlich darum, dass z.B bei einer Bestellung als default-Wert aktuelles Datum gespeichert wird, oder der Benutzer gibt im Sonderfall selber ein Datum ein. Die ganze Aufgabe ist hier zu finden Prog II. 

Ich habe es mir so gedacht, das ich die aktuellen tag, monat und jahr in Hilfsvariablen speichern kann, z. B so

```
static Calendar cal = Calendar.getInstance ();
static int tag = cal.get( Calendar.DAY_OF_MONTH );
static int monat = (cal.get( Calendar.MONTH ) + 1 );
static int jahr = cal.get( Calendar.YEAR );
```
aber das geht ja nicht, da die Variablen sich immer wieder aktualisieren 

Könnt ihr mir vielleicht ein Beispiel geben?


----------



## OliverKroll (22. Apr 2010)

Die Variablen der Klassen Calendar und Date aktualisieren sich nicht selbständig:

```
package pack1;

import java.util.*;

public class Hauptprogramm 
{
	public static void main(String[] args)
	{
		Calendar jetzt1;
		Date jetzt2;
		
		jetzt1=Calendar.getInstance();
		jetzt2=jetzt1.getTime();
		
		while(true)
		{
			System.out.println(jetzt1.get(Calendar.SECOND)+" "+jetzt2.getSeconds());
		}
	}
}
```
Die Variablen der Klassen Calendar und Date geben immer die gleiche Sekunde aus.

Du brauchst Tag, Monat und Jahr nicht einzeln zu speichern, das macht die Klasse Date oder Calendar für dich. Im Konstruktor deiner Klasse Bestellung würdest die schreiben:

```
package pack1;

import java.util.*;

public class Bestellung 
{
	private Date datum;
	
	public Bestellung()
	{
		datum=new Date();
	}
}
```

Calendar ist eigentlich die bessere Klasse (Date ist teilweise bereits deprecated/unerwünscht), aber Date ist in deiner Aufgabenstellung vorgesehen.


----------



## pozzitiv (22. Apr 2010)

OliverKroll hat gesagt.:


> Im Konstruktor deiner Klasse Bestellung würdest die schreiben:
> 
> ```
> package pack1;
> ...



Aber in diesem Fall ist mein Bestelldatum immer das aktuelle Datum. Also wenn ich z.B sowas mache

```
Bestellung bestellung01 = new Bestellung();
System.out.println(bestellung1.getDat());
```
ist mein Bestelldatum immer aktuell. Ich brauche aber, dass das Datum gespeichert wird, wo ich das Objekt bestellung1 erzeuge. Ich komme aber nicht drauf, wie ich diese speichern kann. ???:L


----------



## Tomate_Salat (22. Apr 2010)

zeig mal deine [c]getDat()[/c] welche besser [c]getDate()[/c] heisen sollte


----------



## pozzitiv (22. Apr 2010)

ist ja ein standart getter 

```
public Date getDat() {
		return dat;
	}
```


----------



## Michael... (22. Apr 2010)

In Deinem ersten Code verwendest Du statische Variablen, das kann ja nicht so funktionieren wie Du willst.
Im zweiten Fall gibt's Du ja unmittelbar nach dem Du die Bestellung erzeugt (und damit das Datum gesetzt) hast das Datum wieder aus --> entspricht dem aktuellen Datum.

Zeig doch mal Deinen momentanen Code.


----------



## Tomate_Salat (22. Apr 2010)

Zeig mal die komplette Klasse, denn eigentl. sollte das funktionieren:


```
import java.util.Date;

public class Main 
{
    private Date current;
    
    public static void main(String[] args) 
    {    
        Main main   = new Main();
        
        main.doOrder();
        
        System.out.println( main.getOrderDate() );
        
        try { Thread.sleep(2000); } catch(InterruptedException e) { e.printStackTrace(); }
        
        System.out.println( main.getOrderDate() );
        
        main.doOrder();
        
        System.out.println( main.getOrderDate() );
    }
        
    public void doOrder()
    {
        current = new Date();
    }
    
    public Date getOrderDate()
    {
        return current;
    }
}
```

Ausgabe:

```
Thu Apr 22 09:21:42 CEST 2010
Thu Apr 22 09:21:42 CEST 2010
Thu Apr 22 09:21:44 CEST 2010
```


----------



## pozzitiv (22. Apr 2010)

Das ist die Klasse Bestellung

```
package weinvertrieb;
import java.util.Date;

public class Bestellung {
	
	private Weinflasche weinflasche;
	private int anzahl; // Flaschen / Kartons / Paletten
	private AVerpackungseinheit verpackung;
	private Date current; // Bestelldatum
	private AKunde kundenTyp;	
	
	private double gesamtPreis; // ohne Rabattabzug
	private double gewaehrterRabatt; // Rabatt abhängig vom Kunden
	
	
	public Bestellung (Weinflasche weinflasche, int anzahl, AVerpackungseinheit verpackung, Date current, AKunde kundenTyp){
		this.weinflasche=weinflasche;
		this.anzahl=anzahl;
		this.verpackung=verpackung;
        this.current=current;
		this.kundenTyp=kundenTyp;
	}
	
	public Bestellung(){
		
		this(new Weinflasche(), 1, new Palette(), new Date(), new Grossverbraucher());		
	}
		
	public int getAnzahl() {
		return anzahl;
	}

	public void setAnzahl(int anzahl) {
		this.anzahl = anzahl;
	}

	public Date getDate() {
		return current;
	}

	public void setDate(Date current) {
		this.current = current;
	}
	
	
	public double berechneGesamtpreis(){
		gesamtPreis=(double)anzahl * verpackung.getAnzahlFlaschen() * weinflasche.getPreis();
		return gesamtPreis;
	}
	
	public double berechneGewaehrterRabatt(){
		gewaehrterRabatt= (berechneGesamtpreis() * kundenTyp.getRabatt()) / 100 ;
		return gewaehrterRabatt;
	}
	
	public double berechneNettoPreis(){
		return berechneGesamtpreis() - berechneGewaehrterRabatt();
	}

	public String toString() {
		return "Bestellung [anzahl=" + anzahl + ", dat=" + current
				+ ", gesamtPreis=" + gesamtPreis + ", gewaehrterRabatt="
				+ gewaehrterRabatt + ", kundenTyp=" + kundenTyp
				+ ", verpackung=" + verpackung + ", weinflasche=" + weinflasche
				+ "]";
	}
}
```

muss ich also in der main-Klasse ein extra Date-Objekt erzeugen?


----------



## Tomate_Salat (22. Apr 2010)

pozzitiv hat gesagt.:


> Das ist die Klasse Bestellung



Die sollte so funktionieren. Aufgrund dessen, da [c]getDat[/c] jetzt [c]getDate[/c] heist und die Variablen nicht mehr [c]static[/c] sind, nehme ich mal an: du hast sie überarbeitet ;-)



> muss ich also in der main-Klasse ein extra Date-Objekt erzeugen?


Was?Hä? Nein, die Main-Klasse von mir sollte nur ein Beispiel sein. Mir ging es darum, wie man [c]Date[/c] speicher und wieder aufrufen kann :-/


----------



## Wortraum (22. Apr 2010)

Abgesehen von der Namensgebung und der Parameteranzahl im Konstruktor sieht das doch gut und richtig aus.

Bei _setDate(Date current)_ kann man aber jedes beliebige Datum übergeben. Wenn Du nur das aktuelle setzen möchtest, brauchst Du keinen Parameter:

```
public void setCurrentDate() {
    date = new Date();
}
```


----------



## pozzitiv (22. Apr 2010)

gut jetzt verstehe ich)) wie kann ich denn so ein Date selber eingeben, falls ich kein default konstruktor benutze?


----------



## pozzitiv (22. Apr 2010)

gut jetzt verstehe ich)) wie kann ich denn so ein Date selber eingeben, falls ich kein default konstruktor benutze?  tt.mm.jjjj versteht compiler nicht


----------



## OliverKroll (22. Apr 2010)

Probier's mal damit:

Hauptprogramm:

```
package pack1;

import java.util.*;

public class Hauptprogramm2 
{
	public static void main(String[] args)
	{
		Bestellung bestellung1;
		
		bestellung1=new Bestellung();
		
		System.out.println(bestellung1.getDatum());
		
		bestellung1.setDatum(new Date(2010-1900,4-1,22,11,12,15));
		
		System.out.println(bestellung1.getDatum());
	}
}
```

Bestellung:

```
package pack1;

import java.util.*;

public class Bestellung 
{
	private Date datum;
	
	public Bestellung()
	{
		datum=new Date();
	}
	
	public Date getDatum()
	{
		return this.datum;
	}
	
	public void setDatum(Date datum_neu)
	{
		this.datum=datum_neu;
	}
}
```

Zum Konstruktor von Date siehe Java 2 Platform SE v1.4.2


----------



## pozzitiv (22. Apr 2010)

ich würde das gerne erstmal über Konstruktor hinkriegen. also irgendwie so

```
Bestellung bestellung1=new Bestellung(flasche1, 5, palette, tt.mm.jjjj, verbraucher1);
```

habe das hier gefunden


----------



## OliverKroll (22. Apr 2010)

Zur Umwandlung eines Strings in ein Datum verwendet man zum Beispiel SimpleDateFormat SimpleDateFormat (Java 2 Platform SE v1.4.2)


----------



## Michael... (22. Apr 2010)

pozzitiv hat gesagt.:


> ich würde das gerne erstmal über Konstruktor hinkriegen. also irgendwie so
> 
> ```
> Bestellung bestellung1=new Bestellung(flasche1, 5, palette, tt.mm.jjjj, verbraucher1);
> ...




```
Bestellung bestellung1=new Bestellung(flasche1, 5, palette, new Date(2010-1900, 3, 22), verbraucher1);
```
Aber Achtung der Date Konstruktor ist deprecated um man sollte sowas eher über Calendar erzeugen.


----------



## Wortraum (22. Apr 2010)

Michael... hat gesagt.:


> ```
> Bestellung bestellung1=new Bestellung(flasche1, 5, palette, new Date(2010-1900, 3, 22), verbraucher1);
> ```
> Aber Achtung der Date Konstruktor ist deprecated um man sollte sowas eher über Calendar erzeugen.


Das wollte ich auch gerade noch einwenden. Date ist nicht mehr viel mehr als ein Hüllobjekt, das einen long-Wert mit Millisekunden kapselt. Dafür kann man es auch verwenden, aber sobald man mit einzelnen Tagen oder mit Jahren hantiert, gleich, ob man sie nun setzen oder aus den Millisekunden berechnen lassen möchte, sollte man zu Calendar greifen.


----------



## pozzitiv (22. Apr 2010)

Michael... hat gesagt.:


> ```
> Bestellung bestellung1=new Bestellung(flasche1, 5, palette, new Date(2010-1900, 3, 22), verbraucher1);
> ```
> Aber Achtung der Date Konstruktor ist deprecated um man sollte sowas eher über Calendar erzeugen.


 Danke. Klappt bestens.  Sagst du vielleicht noch wie man die Uhrzeit da hinzufügt...


----------



## Michael... (22. Apr 2010)

Lesen bildet ;-)
Date hat mehrere (deprecated!!!) Konstruktoren.
Besser ist wie gesagt z.B. Calendar


----------



## w0ddes (22. Apr 2010)

Dass Date teilweise deprecated ist haben glaub inzwischen alle verstanden.. aber in seiner Aufgabenstellung steht es nunmal als Attribut so: 


```
private Date datum; // Bestelldatum
```
 also muss er Date verwenden


----------



## Michael... (22. Apr 2010)

Die Klasse Date ist nicht deprecated, nur einzelne Methoden und Konstruktoren.
Man kann ja auch über Calendar ein Date Objekt erzeugen.


----------



## pozzitiv (22. Apr 2010)

Michael... hat gesagt.:


> Lesen bildet ;-)
> Date hat mehrere (deprecated!!!) Konstruktoren.
> Besser ist wie gesagt z.B. Calendar


gut. jetzt komme ich mit JavaDoc viel besser klar anhand deines Beispiels und kann es z.B schon selber rausfinden mit  der Uhrzeit. 
Die Prof hat Date als Datentyp vorgegeben. Ich will Rad nicht neu erfinden


----------



## w0ddes (22. Apr 2010)

Okay, hast ja recht Micahel .. ab und zu sollt ich auch mehr lesen   Calender.getTime()  liefert ein Date Objekt .. 

Calendar (Java Platform SE 6)


----------



## Wortraum (22. Apr 2010)

pozzitiv hat gesagt.:


> Die Prof hat Date als Datentyp vorgegeben. Ich will Rad nicht neu erfinden


Sehr klug, aber kaputte Räder sollte man trotzdem nicht wiederverwenden. „Kein Trinkwasser“ in einer öffentlichen Toilette hat ebenso viel Sinn wie „@deprecated“ über einer Methode.

Generell halte ich es für keine gute Idee, das Datum als Zeichenkette zu übergeben und diese dann als Datum zu interpretieren, wenn man doch gleich das Datum übergeben könnte. Die eigenen Klassen, die man programmiert, erledigen sonst irgendwann zu viele Aufgaben selbst, werden groß, unhandlich, unverständlich, komplex und unflexibel.

Also wenn man ein Objekt erstellt, entweder das aktuelle Datum automatisch setzen oder aus einem Parameter entgegennehmen. Und für alles, was nicht mit Millisekunden zu tun hat, auf keinen Fall Date, sondern Calendar nutzen.


----------



## pozzitiv (22. Apr 2010)

ich wollte jetzt mit Calendar das aktuelle Datum auslesen aber mit

```
System.out.println( Calendar.DAY_OF_MONTH + "." + (Calendar.MONTH+1) + "." + Calendar.DAY_OF_MONTH );
```
kriege ich 5.2.5. was stimmt denn nicht?


----------



## Michael... (22. Apr 2010)

Du kannst ja nicht einfach die statischen Variablen der Klasse auslesen und erwarten, dass da was sinnvolles rauskommt ;-)

Du musst eine Instanz von Calender erzeugen

```
Calendar calendar = Calendar.getInstance();
System.out.println(DateFormat.getDateInstance().format(calendar.getTime()));
```
Wenn Du einen konkreten Wert auslesen willst, z.B. Tag des Monats:

```
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
```


----------



## Wortraum (22. Apr 2010)

pozzitiv hat gesagt.:


> ich wollte jetzt mit Calendar das aktuelle Datum auslesen aber mit
> 
> ```
> System.out.println( Calendar.DAY_OF_MONTH + "." + (Calendar.MONTH+1) + "." + Calendar.DAY_OF_MONTH );
> ...


Alles. Was Du ausgibst, sind einfach nur Indizes oder Kennummern irgendwelcher Daten oder Felder – was genau damit intern gemacht wird, weiß ich nicht, und es spielt auch keine Rolle. Was Du eigentlich wolltest, ist so etwas:

```
Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH) + 1;
int year = cal.get(Calendar.YEAR);
System.out.println(day + "." + month + "." + year);
```

Und wie schon mehrfach gesagt wurde, geht so etwas mit SimpleDateFormat sehr einfach.

```
SimpleDateFormat sdf = new SimpleDateFormat("dd.mm.YYYY");
Date now = new Date();
System.out.println(sdf.format(now));
```
Oder Du machst es wie Michael, dann ist die Darstellung aber abhängig von der Lokalisierung.


----------



## pozzitiv (27. Apr 2010)

Vielen Dank. Ist erstmal für die Aufgabe abgehackt. Sind noch paar fragen geblieben, werde ich aber nächstes mal fragen=)


----------



## 086033 (7. Mai 2010)

Ich muss bei einem Projekt das aktuelle Ausleihdatum speichern (was ich mit den obigen Erklärungen hin kriegen sollte) aber zusätzlich noch das Rückgabedatum berechnen lassen. Also Ausleihdatum + 14 Tage. Wie mache ich das nun?

Sorry, das ist die erste Klasse, welche ich aus der Bibliothek importiere und kenne mich daher noch nicht so aus mit Klassen interpretieren.

Zudem, sollte zwar nicht in diesen Thread, habe ich ein kleineres Problem. Die Aufgabe ist: "Es soll eine Methode 
[Java]ausgeben(Medium medium)[/code] implementiert werden, welche alle Datenfelder aller Medien der Kategorie medium ausgibt."

Nebst der Klasse Datenbank, habe ich eine Superklasse Medium und Subklassen CD, DVD, ... Ich verstehe die Aufgabe nun so, dass ich als Parameter z.B. CD eingeben kann und mir alle Datenfelder der Objekte der Klasse CD ausgegeben werden. Mein Problem ist aber, dass ich als medium nur Objekte angeben kann und keine Klasse (z.B. CD).

Ich wollte folgendermassen vorgehen:

```
public class Datenbank

public void ausgeben(Medium medium)
    // bsp. für CD... 
{    
    if (medium.equals(CD)) {
        for(Medium m : medien) {
            if (m instanceof CD) { 
            System.out.println(m);
            }
        }
    }
}
```

Besten Dank! für eure Hilfe!


----------

