powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Unparseable date: в коде
25 сообщений из 31, страница 1 из 2
Unparseable date: в коде
    #39510921
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Есть файл MS Excel.
В нем дата хранится в формате: 25-08-2017 03:53
Если открыть свойства столбца с датами в Excel, то формат такой:

Custom
ДД-ММ-ГГГГ чч:мм

Когда подключаюсь к файлу и пытаюсь парсить вылазит ошибка:

Код: java
1.
2.
java.text.ParseException: Unparseable date: "24-Aug-2017"
	at java.text.DateFormat.parse(Unknown Source)



Вот функция которой пытаюсь парсить:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
	private static Date getValueAsDate(String s) throws ParseException {

		Date DepparsedDate = new Date();

		Date FinalDate = new Date();
		
		if (!s.equals(null)) {

			SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
			
			SimpleDateFormat print = new SimpleDateFormat("yyyy-MM-dd HH:mm");

			DepparsedDate = sdf.parse(s.toString());
			
			FinalDate = print.parse(DepparsedDate.toString());

		}
        return FinalDate;

	}



Прошу помочь, в чем ошибка?
Использую Apache POI

Спасибо заранее.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510922
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шаблон не соответствует входящей строке, которую вы парсите.
И переменные называйте, пожалуйста, с маленькой буквы.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510924
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Август пришел с буквами. И черточки "-" забыл в шаблоне.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510925
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А каким должен быть шаблон для: 24-Aug-2017?
Я второй день парюсь с этим, раньше с БД без проблем парсил, а в от с MS Excel траблы.
Прошу подсказать корректный шаблон.
Я испробовал все шаблоны что знал.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510927
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid, подожди. Ты писал выше
Есть файл MS Excel.
В нем дата хранится в формате: 25-08-2017 03:53
Если открыть свойства столбца с датами в Excel, то формат такой:

Custom
ДД-ММ-ГГГГ чч:мм

Далее мы получаем текст экцепшена где явно видно что прилетела дата "24-Aug-2017".

Разберись в каком формате все-таки приходит дата. А то ты нас запутаешь и себя запутал.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510930
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuidВ нем дата хранится в формате: 25-08-2017 03:53

Первая ошибка - дата не хранится в Excel в этом формате, а только показывается. Из этого следует вторая ошибка - вы читаете дату как строковое значение, при чтении возникает другой формат, который вы и видите. Ничего парсить не надо (да и слово парсить не существует). В Excel дата хранится в числовом формате (которому в POI соответствует тип ячейки CellType.NUMERIC), читать это значение надо с помощью Cell.getDateCellValue(). Результат получается в виде java.util.Date.

Пример

Код: java
1.
2.
3.
4.
5.
6.
XSSFCell cell = ...

Date cellValue = null;
if (cell.getCellType().equals(CellType.NUMERIC)) {//читаем как дату. Но тип может быть и например CellType.BLANK
  cellValue = cell.getCellDateValue();
}
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510932
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустил опечатку. Надо
if (cell.getCellTypeEnum().equals(CellType.NUMERIC))

функция getCellType() устарела, указал по привычке. Хотя можно и её использовать:

if (cell.getCellType () == CellType.NUMERIC)
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510933
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan M читать это значение надо с помощью Cell.getDateCellValue(). Результат получается в виде java.util.Date.

Кстати, да.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39510970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid, посмотри в свойствах ячейки. В той ячейке которая проблеманая.
В каком формате представлена дата?
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511089
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро.

Я получил данные:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
	private static Date getValueAsDate(Cell cell) throws ParseException {

		Date date = new Date();

		Date finalDate = new Date();
		
		if (cell.getCellType () == Cell.CELL_TYPE_NUMERIC)
			
		{

			date = cell.getDateCellValue();			
		}
		
		SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");
		
		finalDate = formatter.parse(date.toString());
		
        return finaDate;

	}



Вышел результат
Код: java
1.
Sun Aug 27 09:58:13 UZT 2017



Мне эти данные нужно теперь залить в MS SQL Server в формате dd-MM-yyyy HH:mm
Столбец в MS SQL Server типа datetime

Но MS SQL Server не примет в формате Sun Aug 27 09:58:13 UZT 2017
Пыаюсь вставить в MS SQL Server но ругается на строке:

finalDate = formatter.parse(date.toString());

Код ошибки:

Код: java
1.
java.text.ParseException: Unparseable date: "Tue Jul 11 05:05:00 UZT 2017"
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511090
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь там дата в обоих случаях Tue Jul 11 05:05:00 UZT 2017
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511093
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дак ведь явно сообщается, что ваша дата не парсится.
Прям даже если элементы в шаблоне посчитать и посмотреть разделители и сравнить
Код: java
1.
new SimpleDateFormat("dd-MM-yyyy HH:mm");


с тем что выводится в консоль
Код: java
1.
java.text.ParseException: Unparseable date: "Tue Jul 11 05:05:00 UZT 2017"



Но всё это ерунда вообще и не нужно, т.к. вы уже получили Date(), зачем ее сейчас опять в строку переводить и затем снова парсить получая тот же самый Date() который уже есть,
извращенства чтоль какие-то у вас?)))
Вы уже Date получили, дак сувайте его в майскуль, посредством той же Java.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511094
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы хотите дату в виде строки отдавать майскулу, то тогда вам надо полученный Date()
переводить в строку и её возвращать в вашем методе.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private static String getDateFromExcelAndConvertToString(Cell cell) throws ParseException {
		Date date = new Date();
		String finalDateStr;
		if (cell.getCellType () == Cell.CELL_TYPE_NUMERIC)
		{
		   date = cell.getDateCellValue();			
		}
		DateFormat df= new SimpleDateFormat("dd-MM-yyyy HH:mm");
		finalDateStr = df.parse(date.toString());
                System.out.println("Final Date: " + finalDateStr );
        return finaDateStr;
}


Должно работать, но я не проверял.
И уже строку отдавайте майскулу, в вашем формате из df.
А вообще этот метод надо бы разделить на два, первый получает дату из экселя, кстати почему она у вас new Date() сразу, так и надо? типа если не получили дату, то берем текущую дату? Второй метод конвертит вашу Date() в String(), пригодный для испорта в майскул
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511095
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	private static String getValueAsDate(Cell cell) throws ParseException {

		Date date = new Date();

		String finalDate = null;
		
		if (cell.getCellType () == Cell.CELL_TYPE_NUMERIC)
			
		{

			date = cell.getDateCellValue();
			
			SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");
			
			finalDate = formatter.format(date);

		}
				
        return finalDate;

	}



Ну вообщем MS SQL разрешает строку ставить в столбец datetime НО:

Некоторые записи не вставились, пишет вот так:

Код: java
1.
2.
3.
INSERT INTO dbo.TRAIN_DELIVERY VALUES('3251.0',N'Разъезд 8 км. 20','25.08.2017 11:10','25.08.2017 11:50','25.08.2017 14:02','25.08.2017 14:23',N'ст. 9','00:40','02:12',N'вагон','62.0','13.0',N'0/0кр;0/0пл;62/13пв;0/0цс;0/0думп;0/0пр;',N'Пользователь1',N'Пользователь2',N'Нет')
com.microsoft.sqlserver.jdbc.SQLServerException: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217)



Из 1000 строк добавил 250 а остальные с такой ошибкой отвалились.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511096
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу отметить что все строки стандартные по одному формату и пустых нет.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511103
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот чем они отличаются?
Первая запись добавилась а вторая пишет ошибку

Код: java
1.
2.
com.microsoft.sqlserver.jdbc.SQLServerException: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217)



Код: plsql
1.
2.
3.
INSERT INTO dbo.TRAIN_DELIVERY VALUES('3123.0',N'8 км. 5','12-07-2017 17:03','12-07-2017 17:18','12-07-2017 17:20','12-07-2017 17:38',N'ст. 9','00:15','00:02',N'газовый',80,0,N'0/0кр;0/0пл;0/0пв;80/0цс;0/0думп;0/0пр;',N'user1',N'user3')

INSERT INTO dbo.TRAIN_DELIVERY VALUES('4301.0',N'8 км. 3','13-07-2017 00:17','13-07-2017 00:18','13-07-2017 00:19','13-07-2017 00:40',N'ст. 2Б','00:01','00:01',N'тепловоз',0,0,N'0/0кр;0/0пл;0/0пв;0/0цс;0/0думп;0/0пр;',N'user2',N'user4')
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511113
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас только чисто по SQL. Не беря в расчет Java-код.

LiQuid, у тебя в SQL-запросе нигде явно не стоит кастинг в date с указанием формата.
Отсюда возникает вопрос. Откуда MS-SQL знает где стоит день а где стоит месяц?

Вот это значение:
Код: java
1.
'13-07-2017 00:17'



Можно трактовать как MM-DD-YYYY а можно и наоборот как DD-MM-YYYY. Отсюда возможный
кейс когда месяц номер 13 не существует.

Я вообще в MS-SQL не разбираюсь. Но КМК в MS-SQL как и в Oracle есть некие дефолтные
форматы дат которые зависят от того как ты залогонился. Напремер чел из России
получит формат DD.MM.YYYY, американец свой родной Mon, DD YYYY и так далее.

Вобщем конверть явно или конфигури environment явно.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511118
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Хорошо,
Вот у меня чисто функция которая получает тип Date

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	private static Date getValueAsDate(Cell cell) throws ParseException {

		Date date = new Date();
		
		if (cell.getCellType () == Cell.CELL_TYPE_NUMERIC)
			
		{

			date = cell.getDateCellValue();

		}
						
        return date;

	}



Функция вернет мне "Tue Jul 11 05:05:00 UZT 2017"

Теперь мне нужно это вставить в MS SQL Server таблицу.

Но формат столбца datetime в MS SQL Server не примет в таком виде.

Столбец примит эту дату только в виде dd-MM-yyyy HH:dd

Я же все равно должен буду этот формат как то осуществить?

Если не превращать в String и обратно в Date, то как по другому?

Мне же конечный результат нужен Date только в формате dd-MM-yyyy HH:dd
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511121
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в виде String вставлять в MS SQL Server в столбец с форматом datetime, MS SQL Server не понимает про 00 т.е 24 часа ночи,
если в формате Date отправить то он должен понять.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511124
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuidМне же конечный результат нужен Date только в формате dd-MM-yyyy HH:dd
Это и есть строка.

По майскулу ничего не знаю. Я бы подключился к нему средствами Java и сразу бы писал из нее в базу.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511149
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuidЕсть файл MS Excelфайл в студию !
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511162
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поддерживаю.
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511210
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuidФункция вернет мне "Tue Jul 11 05:05:00 UZT 2017"

Вовсе нет. Функция вернёт объект java.util.Date, который не имеет никакого формата, а "Tue Jul 11 05:05:00 UZT 2017" это его представление в виде строки, которое получилось автоматически, поскольку вы не задали самостоятельно никакого формата (поэтому используется формат даты-времени, установленный у вас в компьютере по умолчанию). Для получения другого текстового представления можно использовать SimpleDateFormat. Для вставки в базу даты, представленной строкой, надо использовать функцию приведения строки к дате, имеющуюся в используемой СУБД (такая функция есть во всякой СУБД, но её название надо узнавать из документации). Вы путаете MySQL и MS SQL Server, но всё же можно догадаться, что имеется ввиду MS SQL Server. Вот, смотрю в его документации функцию получения даты (точнее, вам нужен тип DATETIME) и вижу, что она называется CAST, например

CAST('2007-05-08 12:35:29.123')
Допустимые форматы и способ задания желаемого формата ищете в документации по функциям SQL нужной СУБД.

Можно и не приводить дату к строке. Для этого вместо Statement использовать PreparedStatement. В нём в SQL вставляемые значения заменяются на "?", и для вставки фактических значений использовать операторы вроде

String sql = "NSERT INTO dbo.TRAIN_DELIVERY VALUES(?,?,?)";//упростил выражение для примера
PreparedStatement pstmt = connection.prepareStatement(sql);
//задание значений
pstmt.setDate (3, date);//3 - номер "?" по порядку, начиная с 1, date - значение типа java.sql.Date, надо получить его из имеющегося java.utils.Date

...

int rowsCount = pstmt.executeUpdate();//также подойдёт execute(), подробнее см. в документации по JDBC
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511227
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС не путал MySQL и MS SQL, это я случайно подумал на майскул и написал про него, а про существование MS SQL я вообще забыл, как-то всё больше с первым сталкиваюсь))
ТС про MySQL ни слова не писал :)
...
Рейтинг: 0 / 0
Unparseable date: в коде
    #39511233
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic, у него в стектрейсе есть явное указание на JDBC драйвер от MS.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Unparseable date: в коде
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]