Когда вы получаете значение поля даты/времени через 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, настроенной на использование форматов по умолчанию для «английского (США)», который мы видим
Если мы изменим настройки формата в Windows на «Английский (Великобритания)», то увидим
Если мы хотим использовать определенный формат для одного или нескольких полей, нам нужно использовать определенный параметр формата в Access, например, с чем-то вроде этого
мы видим
person
Gord Thompson
schedule
14.11.2014
PreparedStatement.setDate()
ожидает параметрjava.sql.Date
, который не имеет формата (и он также не используется для вывода) - person a_horse_with_no_name   schedule 15.11.2014setString()
для дат. используйтеsetDate()
. Форматирование дат следует обрабатывать при отображении (=чтении) данных в интерфейсе, а не при их сохранении. - person a_horse_with_no_name   schedule 18.11.2014