2015-06-15 4 views
2

Я извлекая метку времени из Excel (2010):Преобразовать Excel метки времени для java.sql.Date

Он отображается как "10.06.2015 14:24". «Внутреннее представление» Excel - «42165,6». Последний выводится из Excel.

Так, теперь, я хочу, чтобы разобрать эту метку времени в программу Java, как это:

double input = 42165.6; 
// long myLong = ??? 
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm"); 
System.out.println(sdf.format(new java.sql.Date(myLong))); 

Как я могу это сделать в строке 2 ?!

Большое спасибо за вашу помощь !!!

Сердечные приветы

+0

Использовать java.util.Date вместо этого. Java.sql.date - только если вы используете реляционную базу данных. – NickJ

+1

Как вы получаете * ввод * значение? Почему это не дата? – agad

+0

42165 - это число дней, прошедших с эпохи (январь 1900 г.) и .6 указывает время 60% пути через 24-часовой день. Но я согласен, нет ли лучшего способа извлечения даты из Excel? – Curmudgeon

ответ

2

Excel даты хранит как число дней с января 1900 г. Это делает неудобным, чтобы преобразовать в дату Java (миллисекунды с 1 января 1970 года). Если вы не можете экспортировать его в читаемом формате, вам нужно будет создать Java-календарь, установить его до 1 января 1900 года и добавить количество дней.

Здесь:

double excelDate = 42165.6; 
    int days = (int) excelDate; //number of days 
    int seconds = (int) ((excelDate-days) * 86400); //number of seconds in .6 days 

    //create calendar set to 01-Jan-1900 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 1900); 
    cal.set(Calendar.MONTH, 0); 
    cal.set(Calendar.DAY_OF_MONTH, 1); 

    //Add days and seconds to get required date/time 
    cal.add(Calendar.DATE, days-1); 
    cal.add(Calendar.SECOND, seconds); 

    //cal.getTime() returns a java.util.Date, print it out... 
    System.out.println(cal.getTime()); 

ПРИМЕЧАНИЕ java.sql.Date может быть создан из java.util.Date следующим образом:

java.util.Date utilDate = .... 
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
0

Самый быстрый способ получить от обозначений первенствовать к java.sql.Date является:

double excelInput = 42165.6; 
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm"); 
    System.out.println("---> " 
      + sdf.format(new java.sql.Date(
        (long) ((excelInput - 25569) * 86400 * 1000)))); 

Excel хранит дата с 01-01-1900, java.sql.date с 01-01-1970. Между обеими датами разница составляет ровно 25569 дней. Конструктор java.sql.Date хочет миллисекунды (!) С 01-01-1970, поэтому с «* 86400» мы получаем секунды, а затем (* 1000) миллисекунды.

Вот и все! ;)

0

Ввод 42165.6 в excel и форматирование на дату дает правильную дату 6/10/15 14:24.

Для меня ответы mrbela и NickJ дали неверные ответы на вопрос 42165.6, и 06/12/2015 03:25. Это похоже на большинство примеров, которые я пробовал.

Решение, которое сработало для меня, состояло в использовании Apache POI, который представляет собой Java-API для документов Microsoft. Этот номер question очень похож и имел указатели, которые привели меня к поэ.

Вот пример рабочего кода.

double input = 42165.6; 
Date date = DateUtil.getJavaDate(input); 
System.out.println(new SimpleDateFormat("dd.MM.yyyy HH:mm").format(javaDate)); 

который выдает правильную 06/10/2015 14:24

Смежные вопросы