# Anzahl Tage in Datum umwandeln



## Guest (8. Mai 2007)

Hallo,

ich hab folgendes Problem. Ich hab eine Excel-Liste, die ich in ein XML-Datei exportiere um die XML-Datei dann über Java einzulesen um die Daten verarbeiten zu können.

Das Problem ist, eine eine Spalte in der Excel-Liste als Datum formatiert ist. Das hat zur folge, dass das Datum nicht normal (also z.b. für heute 08.05.2007) steht sondern als Zahl (z.b. für heute 39210). Ich bin der Meinung, dass das die Anzahl der vergangenen Tage vom 1.1.1900 bis heute sind. Deswegen habe ich folgendes gemacht um das Datum erst in  millisekunden und dann in ein richtiges Datum umzuwandeln


```
long i = 39210 * 24 * 60 *60 * 1000;
Date d = new Date(i);
System.out.println(d);
```

Leider führt das nicht zum heutigen Datum sondern irgendwann in die Zukunft. Wollte zwar schon immer mal in die Zukunft reisen, aber nicht gerade jetzt.  :lol: 

Hat jemand eine Idee, wie ich es umwandeln kann so dass ich wieder in der Gegenwart bin? Oder weiß jemand, ob die Zahl wirklich die Anzahl der vergangen Tage ist, vielleicht rechnet Excel das ja auch anders um?

Vielen Dank


----------



## SlaterB (8. Mai 2007)

das habe ich auch vor kurzem kennengelernt 
Tag 0 ist glaube ich irgendwas von 1950,

kannst dir ja selber genau ausrechen, wichtig ist erstmal nur ein Richtwert,
Excel-Tag x = Date y


```
/**
     * beliebiger Richtwert zur Umrechnung von Java-Date nach Excel-Date als double, beide
     * Werte müssen zusammenpassen
     */
    private static final Date EXCEL_CONVERSION_DATE;
    private static final double EXCEL_CONVERSION_DATE_DOUBLE = 38989;

    static
    {
        Calendar c = new GregorianCalendar(2006, 8, 29);
        EXCEL_CONVERSION_DATE = c.getTime();
    }
```

bisschen weiterrechnen darfst zu selber


----------



## L-ectron-X (8. Mai 2007)

SlaterB hat gesagt.:
			
		

> Tag 0 ist glaube ich irgendwas von 1950[/code]


01.01.1970, so weit ich weiß.


----------



## SlaterB (8. Mai 2007)

?? hier gehts doch nicht um Java..

aber 1950 stimmt auch nicht, 1900 schon eher

38989 / 365 ~ 107


----------



## HoaX (8. Mai 2007)

beim javadatum fangen die millisekunden aber erst am 1.1.1970 an, daher ist dein datum dann etwas in der zukunft.

vorschlag:

```
Calendar cal = Calender.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calender.MONTH, 0);
cal.set(Calendar.YEAR, 1900);
cal.add(Calendar.DAY, deineExcelTage);
Date d = cal.getTime();
```

calendar-konstanten evtl korrigieren. mit dem calendar werden dann auch schaltjahre berücksichtigt.


----------



## sgr (8. Mai 2007)

oh mann, warum ich als Gast geschrieben hab tät ich auch  mal gerne wissen. Hatte mich doch extra eingeloggt.  ???:L 



			
				SlaterB hat gesagt.:
			
		

> ?? hier gehts doch nicht um Java..
> 
> aber 1950 stimmt auch nicht, 1900 schon eher
> 
> 38989 / 365 ~ 107



Natürlich gehts hier um Java will ja wissen wie ichs am Besten in Java umrechne. Leider gehts halt in dem Moment net ohne die Schnittstelle Excel




			
				HoaX hat gesagt.:
			
		

> beim javadatum fangen die millisekunden aber erst am 1.1.1970 an, daher ist dein datum dann etwas in der zukunft.


Ups, dachte die beginnen auch am 1.1.1900. Gut zu wissen. Das kann natürlich der Grund dafür sein, dass es nicht so geht. Morgen früh gleich mal deine Lösung probieren.


----------



## The_S (9. Mai 2007)

Warum nicht einfach


```
GregorianCalendar cal = new GregorianCalendar(1900, 0, 1);
cal.add(Calendar.DATE, days);
```


----------



## sgr (9. Mai 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Warum nicht einfach
> 
> 
> ```
> ...



Danke funktioniert "fast" perfekt. Hab noch folgendes Problem. Das Datum unterscheidet sich immer um 2 Tage. Das heißt, wenn ich in Excel z.b den 9.5.2007 eingebe bekomme ich als Referenzzahl die 39211. Rechne ich diese jetzt in Java um bekomme ich den 11.5.2007 raus. 

Hat jemand ne Ahnung woran das liegen kann. Oder weiß jemand, ob das immer so ist, denn dann könnte ich ja einfach -2 machen.


----------



## sgr (9. Mai 2007)

Ok hab die 2 verloren Tage gefunden.

1. Tag:
Bei Excel steht die 1 für den 1.1.1900 und nicht die 0


2. Tag:
In java ist dass Jahr 1900 kein Schaltjahr. In Excel gibt es allerdings den 29.2.1900. So verschiebt sich nochmals das Datum immer um 1. 

Das bedeutet, dass das immer so ist und ich einfach -1 schreiben kann. Also mach ich es jetzt so:


```
cal = new GregorianCalenda(1900, 0 , -1)  //-1 da Excel bei 0.0.1900 anfaengt zu zaehlen, und im Jahr 1900 ein Zaehlfehler ist
cal.add(Calendar.DATE, days);
```

So geh ich zwar das Risiko ein, dass ein Datum kleiner als der 01.03.1900 falsch berechnet wird. Aber das wird bei mir eh nicht vorkommen, da das Datum eh nur in der Zukunft liegt. Also egal.

Somit ist mein Problem gelöst.  :applaus:  (Leider kann ich keinen hacken ran machen)


----------



## The_S (9. Mai 2007)

Ich würde mal sagen, dass ist ein Excel-Fehler, da das Jahr 1900 definitiv kein Schaltjahr ist (zwar glatt durch 4 teilbar, aber ebenfalls glatt durch 100, jedoch nicht durch 400)!


----------



## André Uhres (9. Mai 2007)

sgr hat gesagt.:
			
		

> ..Leider kann ich keinen hacken ran machen)


Jetzt anmelden! Und beim nächsten Mal einloggen, dann klappt's.
EDIT: quatsch, haste ja gemacht


----------



## SlaterB (9. Mai 2007)

wenn du das schon zitierst, dann fehlt doch der Hinweis
Haken != Hacken != Harken


----------



## The_S (9. Mai 2007)

*mit der mistgabel auf euch einhackt*


----------



## Wildcard (9. Mai 2007)

*abgehackt*  :wink:


----------

