Форматирование дат при использовании драйвера JDBC UCanAccess

При использовании драйвера UCanAccess в Java мне очень сложно выводить даты в определенные форматы. В настоящее время я использую метод PreparedStatement.setDate(), который требует, чтобы дата была в формате [гггг-ММ-дд ЧЧ:мм:сс]. Результирующий вывод, когда пользователь открывает файл, также имеет этот формат.

РЕДАКТИРОВАТЬ *. Я не использую метод setDate() с отформатированной датой, этот метод принимает только объекты Java Date, которые не имеют форматирования. Я хотел написать, что использую метод setString() при работе с форматированной датой, но UCanAccess требует, чтобы эта строка даты была в формате [гггг-мм-дд чч:мм:сс]. Я действительно просто пытаюсь понять, как передать ему другой формат или изменить формат после того, как я вызвал setString().

До сих пор это было нормально, но теперь мне нужно доставить файл с датами в различных форматах, таких как [MM-dd]. Я могу сделать это уже, сделав результирующее поле доступа типом заметки или текста, но проблема возникает, когда мне нужно, чтобы дата была в этом формате, а результирующий тип поля доступа по-прежнему был датой/временем.

Я заметил, что на главной странице UCanAccess упоминается поддержка формата даты доступа, но я не нашел примеров. в любом месте после нескольких поисков Google. Кто-нибудь знает, как форматировать даты с помощью этого драйвера, сохраняя при этом правильный тип даты/времени?

Заранее спасибо!


person ksmark    schedule 14.11.2014    source источник
comment
PreparedStatement.setDate() ожидает параметр java.sql.Date, который не имеет формата (и он также не используется для вывода)   -  person a_horse_with_no_name    schedule 15.11.2014
comment
Вы очень правы, @a_horse_with_no_name, я использую метод setDate() при использовании Java Dates (просто длинный, без форматирования), а затем использую метод setString() при установке даты с форматированием. Для этого требуется формат [гггг-ММ-дд ЧЧ:мм:сс]. Я пытался сделать так, чтобы я мог передать ему любой формат или программно изменить формат после вызова setString()   -  person ksmark    schedule 18.11.2014
comment
Не используйте setString() для дат. используйте setDate(). Форматирование дат следует обрабатывать при отображении (=чтении) данных в интерфейсе, а не при их сохранении.   -  person a_horse_with_no_name    schedule 18.11.2014
comment
Что ж, проблема здесь в том, что мне даны отформатированные даты в формате String, и мне нужно немного открыть форматирование, чтобы разрешить другие стили. Кроме того, я хотел бы предоставить готовый файл Access, в котором даты отформатированы нужным образом, вместо того, чтобы открывать файл и вносить изменения вручную.   -  person ksmark    schedule 18.11.2014


Ответы (1)


Когда вы получаете значение поля даты/времени через UCanAccess, вы получаете объект java.sql.Timestamp. Он содержит значение даты/времени, но не имеет формата как такового.

Если вы хотите представить это значение даты/времени определенным образом, вам просто нужно отформатировать его по своему вкусу. Вероятно, самый простой способ сделать это с помощью java.text.SimpleDateFormat. Например:

try (ResultSet rs = s.executeQuery("SELECT DateJoined FROM Members WHERE MemberID=1")) {
    rs.next();
    System.out.printf(
            "         \"raw\" value (via .toString()): %s%n", 
            rs.getTimestamp(1).toString());
    SimpleDateFormat mmddFormat = new SimpleDateFormat("MM-dd");
    System.out.printf(
            "formatted value (via SimpleDateFormat): %s%n", 
            mmddFormat.format(rs.getTimestamp(1)));
}

дает нам

         "raw" value (via .toString()): 2014-01-23 00:00:00.0
formatted value (via SimpleDateFormat): 01-23

(Обратите внимание, что когда на странице UCanAccess говорится о «формате даты доступа», речь идет о литералах даты/времени, заключенных в решетку, например: #11/22/2003 10:42:58 PM#. Однако вам почти никогда не нужно включать литералы даты в свои запросы, потому что вы должны используя PreparedStatement с соответствующими параметрами .setTimestamp().)

Дополнение

Точно так же при вставке значений даты/времени в базу данных Access: форматирование значения даты/времени в Java не влияет на способ хранения значения даты/времени в Access (при условии, что оно правильно интерпретируется) и способ он отображается в Access — это функция настроек формата в Access. Например, если мы запустим следующий код Java

try (Statement s = conn.createStatement()) {
    s.executeUpdate(
            "INSERT INTO tblDates " +
            "(ID, mmddyyyy) " +
            "VALUES " +
            "('literal', #12/25/2014#)"
            );
}

SimpleDateFormat mmddyyyyFormat = new SimpleDateFormat("MM/dd/yyyy");
Timestamp mmddyyyyXmas = 
        new Timestamp(mmddyyyyFormat.parse("12/25/2014").getTime());

SimpleDateFormat ddmmyyyyFormat = new SimpleDateFormat("dd/MM/yyyy");
Timestamp ddmmyyyyXmas = 
        new Timestamp(ddmmyyyyFormat.parse("25/12/2014").getTime());

SimpleDateFormat yyyymmddFormat = new SimpleDateFormat("yyyy/MM/dd");
Timestamp yyyymmddXmas = 
        new Timestamp(yyyymmddFormat.parse("2014/12/25").getTime());

try (PreparedStatement ps = conn.prepareStatement(
        "INSERT INTO tblDates " +
        "(ID, mmddyyyy, ddmmyyyy, yyyymmdd) " +
        "VALUES " +
        "('parameters', ?, ?, ?)"
        )) {
    ps.setTimestamp(1, mmddyyyyXmas);
    ps.setTimestamp(2, ddmmyyyyXmas);
    ps.setTimestamp(3, yyyymmddXmas);
    ps.executeUpdate();
}

а затем откройте базу данных Access с Windows, настроенной на использование форматов по умолчанию для «английского (США)», который мы видим

en_us.png

Если мы изменим настройки формата в Windows на «Английский (Великобритания)», то увидим

en_gb.png

Если мы хотим использовать определенный формат для одного или нескольких полей, нам нужно использовать определенный параметр формата в Access, например, с чем-то вроде этого

DesignView.png

мы видим

DatasheetView.png

person Gord Thompson    schedule 14.11.2014
comment
Спасибо за ответ, на самом деле я не пытаюсь запрашивать данные из базы данных Access, а пытаюсь вставить данные в нее. Мне нужно, чтобы дата отображалась пользователю в определенном формате при открытии самого файла. - person ksmark; 16.11.2014
comment
@ksmark Под открытием самого файла вы имеете в виду открытие его в Access? Если это так, то Access по умолчанию будет использовать формат даты/времени General, который ... представляет собой комбинацию параметров короткой даты и длинного времени, определенных на панели управления Windows (региональные настройки) (ссылка: здесь). Если вы хотите видеть определенный формат в Access, вам нужно указать его в Access, например, в свойстве .Format поля Таблица или определенного элемента управления Форма/Отчет. - person Gord Thompson; 16.11.2014
comment
Вау, спасибо за очень подробный ответ здесь. Это отстой, значит, нельзя программно установить свойство Access .Format? Это должно быть сделано после Java-производства файла? - person ksmark; 18.11.2014
comment
@ksmark Я не верю, что Jackcess (и, следовательно, UCanAccess) может указать .Format для поля при создании новой таблицы. Однако вы можете использовать Access для создания файла базы данных с желаемым форматированием (для таблиц, форм, отчетов), оставить таблицы пустыми, а затем использовать UCanAccess, чтобы поместить данные в копию этого скелетного файла вместо создания нового пустой файл .accdb/.mdb с нуля. - person Gord Thompson; 18.11.2014
comment
Хм, может быть, в этом решении есть какой-то свет. В любом случае спасибо за всю помощь с этим! - person ksmark; 20.11.2014