2016-06-27 4 views
2

У меня есть лист excel с ячейкой, содержащей значение даты от 4 сентября 1920 года, которое я хочу проанализировать и использовать в своем приложении. Извлечение его из листа excel отлично работает, но оно не преобразует дату должным образом. Интересно, что когда я извлекаю ячейку, содержащую datevalue с листа excel, он не возвращает dateformat или что-то еще, вместо этого он возвращает двойное значение.Ввод Excel для java date

Мне нужно преобразовать это двойное значение (7552.0) в действительный Date объекта, но я не могу показаться, чтобы сделать это правильно, это ближе всего, что я получил до сих пор:

new SimpleDateFormat("D").parse(getDateFromExcelAsString()) 

getDateFromExcelAsString() метод преобразует двойной в строку:

String.valueOf(dateAsDouble.intValue()) 

проблема заключается в том, что этот метод преобразует 7552.0 двойное значение даты: 4 сентября 1990 г. Но это должно быть 3 сентября 1920 года

ответ

1

Проблема в том, что вы используете разные ссылки. Для дня excel 0 - 31/Dec/1899, а для дня дня даты 0 - 1 января/1970, и это приводит к 70-летнему отклонению.

Я проверил простой и уродливое решение, как:

double value = 7552; 
Date date = new Date(0); 
Calendar cal = new GregorianCalendar(); 
cal.setTime(date); 
cal.add(Calendar.DATE, (int) value - 25569); 
System.out.println(new SimpleDateFormat("d MMMM yyyy").format(cal.getTime())); 

И выход консольного ожидаемый:

3 September 1920 

EDIT: Поскольку в вашем вопросе вы используете SimpleDateFormat для разбора значение excel, я добавлю здесь быстрое и не чистое решение, используя этот подход (вместо Календаря).

double value = 7552; 
SimpleDateFormat inputFormat = new SimpleDateFormat("D"); 
Date date = inputFormat.parse("" + (value - 25568)); 
SimpleDateFormat outputFormat = new SimpleDateFormat("d MMMM yyyy"); 
System.out.println(outputFormat.format(date)); 

Еще раз утешать выходов:

3 September 1920 

Обратите внимание, что теперь день смещение 25568 в день 0 для SimpleDateFormat 31/Декабрь/1969.

+0

Так что, если я правильно понимаю ваше решение, ваше предложение заключается в том, чтобы вычесть 70 лет со дня в java (в размере дневного дня, т.е. 25569), чтобы компенсировать разницу в формате с помощью метода excel для интерпретации даты (в дневном) ? – Ben

+0

Это звучит как быстрая работа, не очень чистая - как вы упомянули, - но это быстрое решение, так что спасибо за ответ, я все равно буду ждать лучшего и менее «взломанного» ответа, но +1 потому что эта работа работает временно. – Ben

+0

Да, это действительно хакерское обходное решение. Я думал об этом, но я не видел никакой стратегии, кроме вычитания смещения. Я также добавил решение с использованием SimpleDateFormat, как вы делали в вопросе. – Julian