Datentypen Apache Poi & Excel Datumsformat

Strahlungsleck

Aktives Mitglied
Hallo Java-Fans,

und zwar arbeite ich momentan mit Apache Poi zum erstellen und auslesen Exceltabellen, das klappt auch ohne Probleme,
nur beim Datum zickt das poi ein wenig rum.

Bis jetzt wurde beim setzen des datums ein long Wert genommen und
per
Java:
System.CurrentTimeMillis();
gesetzt. Aber anstatt selber im
Programm die Werte, für die XML zu setzen, soll er diese aus einer Exceltabelle auslesen und setzen was auch
wunderbar klappt, nur beim Format mit dem Datum klappt es nicht richtig. Für das Datum von Heute setzt er 01.01.70 -.-
habe aber auch das datum so reingeschrieben: 20.07.10 oder mit den Formen =jetzt() / heute() hilft alles nicht,
ich weiß nicht wie ich genau das hinkriegen soll und bräuchte dringend von euch ein paar Ratschläge oder Ideen.
Achja das Datum vom 20.07.10 in Millisek und long Wert 1279576800000
wenn ich es aber so in Excelsetze und den double Wert nach long caste wegen dem Datentyp bekomme ich
folgende Zahl heraus: 40379
evt. hat jmd auch ne Ahnung wie man das umrechnen kann, das würde mir auch schon helfen.

- Poi hat kein long Wert hat (nehm dafür double und caste nach long)
- ich nicht weiß wie ich das Datum korrekt in Excel setzen/formatieren muss
- gibt es eine Umrechnungsmethode oder sogar vorhandende funktion im Java ?!
 
zum Theme 40379 zu Java-Date habe ich mir paar Umrechnungen schrieben
Java:
public class Test
{

    private static final long MILLISECONDS_OF_DAY = 1000 * 3600 * 24;
    private static final long MILLISECONDS_OF_DAY_HALF = MILLISECONDS_OF_DAY / 2;
    /**
     * beliebiger Richtwert zur Umrechnung von Java-Date nach Excel-Date als double, beide
     * Werte müssen zusammenpassen
     */
    private static final Date EXCEL_CONVERSION_DATE = new GregorianCalendar(2006, 8, 29).getTime();
    private static final double EXCEL_CONVERSION_DATE_DOUBLE = 38989;

    /**
     * @param date
     * @return Date als double in Excel-Skala
     */
    public static double getExcelTime(Date date)
    {
        int daysDiff = daysDiff(EXCEL_CONVERSION_DATE, date);
        return EXCEL_CONVERSION_DATE_DOUBLE + daysDiff;
    }

    /**
     * @param dateExcel
     *            Date in Excel-Skala
     * @param calendar
     *            optional, Hilfsobjekt zur Datumsberechnung, wird neu erzeugt wenn null
     * @return Date
     */
    public static Date getDateForExcelTime(int dateExcel, GregorianCalendar calendar)
    {
        int daysDiff = (int)(EXCEL_CONVERSION_DATE_DOUBLE - dateExcel);
        return getDateDaysBefore(EXCEL_CONVERSION_DATE, daysDiff, calendar);
    }

    public static int daysDiff(Date fromDate, Date toDate)
    {
        // ist sicher gegenüber Sommer-/ Winterzeitwechsel, da 12 Stunden aufaddiert
        // werden, bevor die Zahl der Tage (ab-)gerundet wird
        Date from = fromDate;
        Date to = toDate;
        int multiply = 1;
        if (from.after(to))
        {
            multiply = -1;
            from = to;
            to = fromDate;
        }
        long days = (to.getTime() - from.getTime() + MILLISECONDS_OF_DAY_HALF) / MILLISECONDS_OF_DAY;
        return (int)days * multiply;
    }

    /**
     * Subtrahiert eine Anzahl von Tagen von einem Datum. Liefert ein neues Datum mit der
     * neuen Zeit.
     * 
     * @param date
     * @param days
     * @param calendar
     *            optional, Hilfsobjekt zur Datumsberechnung, wird neu erzeugt wenn null
     * @return Date
     */
    public static Date getDateDaysBefore(Date date, int days, GregorianCalendar calendar)
    {
        if (calendar == null)
        {
            calendar = new GregorianCalendar();
        }
        calendar.setTime(date);
        calendar.add(Calendar.DATE, -days);
        return calendar.getTime();
    }
}

dazu findet man bei google auch einiges, vielleicht besseres

Google
 
Zuletzt bearbeitet von einem Moderator:
Hi Slater,

danke für deine schnelle hilfe, hab an google net wirklichgedacht, manchmal sieht man vor lauter Problemen und korrekturen
das was am einfachsten und offentsichtlichsten ist garnicht.

*EDIT*
ging ja nur darum den Wert, den ich von/aus Excel bekomme in den entsprechenden Millisek wert umzurechnen 😉
 
Zuletzt bearbeitet:
irgendwie stehe ich total aufn schlauch und blicke voll 0 durch...
kann mir jmd mal bitte genau erkären wie ich den wert von 40379 (Excel)
halt auf die MilliSek hochgerechnet bekomme ? Sorry =/

Und was sind die 40379 aus Excel? - Tage, Stunden oder Äpfel ?!
 
das sind Tage seit einem bestimmten Referenzdatum,
welches das ist kannst du die selber überlegen bzw. mit meinem Code ausrechnen,
selber gemacht: 30. Dezember 1899, aha, wahrscheinlich 1. Januar 1900, +-1 und so

schau dir doch einfach meinen Code an, wie da mit ganz simplem Rechenschritten ein Date rauskommt,
aus einem Date bekommst du immer auch die Millisekunden, falls zwischen Jahr 1970 und 2060, ansonsten negativ, Überlauf usw.
 

Neue Themen


Zurück
Oben