Как преобразовать длинное значение в значение даты/времени доступа в Jackcess?

У меня есть следующий код:

// Model the table
  Table tbl = new TableBuilder("Transactions")
    .addColumn(new ColumnBuilder("TransactionID", DataType.LONG).setAutoNumber(true))
    .addColumn(new ColumnBuilder("ControllerID", DataType.LONG).setAutoNumber(false))
    .addColumn(new ColumnBuilder("ReaderID", DataType.LONG).setAutoNumber(false))
    .addColumn(new ColumnBuilder("Event", DataType.LONG).setAutoNumber(false))
    .addColumn(new ColumnBuilder("Timestamp", DataType.SHORT_DATE_TIME).setAutoNumber(false))
    .addColumn(new ColumnBuilder("Number", DataType.LONG).setAutoNumber(false))
    .addIndex(new IndexBuilder(IndexBuilder.PRIMARY_KEY_NAME).addColumns("TransactionID").setPrimaryKey())
    .toTable(db);
  // Add the row
  Map<String, Object> values = new HashMap<>();
  values.put("ControllerID", cid);
  values.put("ReaderID", rid);
  values.put("Event", evtNum);
  values.put("Timestamp", ts); // Long; must be converted to DataType.SHORT_DATE_TIME
  values.put("Number", accNum);
  tbl.addRowFromMap(values);

Я хочу преобразовать длинный ts в формат даты, понятный MS Access. Тип столбца «Временная метка» в MS Access — Date/Time, а значения отображаются в форме «ГГГГ-ММ-дд ЧЧ:мм:сс». Что мне нужно сделать, чтобы преобразовать ts?

В этом ответе на аналогичную проблему упоминается преобразование в double (это то, что Access использует для хранения Date/Time полей, согласно источник), но я не понимаю, что мне нужно сделать с моим кодом, чтобы соответствовать ему:

Это также указывает на проблему независимости формата отображения и хранения данных со значениями даты Jet/ACE. Хранилище представляет собой двойное число, где целая часть указывает день с 30 декабря 1899 г., а десятичная часть - часть времени в течение дня. Любая введенная вами дата будет сохранена как одно число.

Дэвид В. Фентон; 4 июля 2010 г.

Примечание. я знаю как преобразовать длинный на java.util.Date, установите время для java.util.Calendar, затем получите из него удобочитаемую/поддающуюся разбору форматированную строку. Это не то, что я пытаюсь сделать, поэтому пометка как дубликат связанного вопроса неверна. Я пытаюсь получить двойное значение, которое понимает MS Access.


person Agi Hammerthief    schedule 14.09.2018    source источник
comment
Вы пробовали: Формат ([FieldName], мм/дд/гг) или функцию CDate? Для CDate просто выполните CDate(YourLongInt)   -  person DanielG    schedule 14.09.2018
comment
@DanielG Из каких классов Java?   -  person Agi Hammerthief    schedule 14.09.2018


Ответы (1)


Хотя Access хранит значения даты и времени в виде Double чисел с плавающей запятой, вам не нужно выполнять это преобразование самостоятельно; Джекес сделает это за вас. Просто передайте java.util.Date Джеккессу, и он позаботится обо всем остальном.

Если ваше длинное ts - это количество миллисекунд с эпохи Unix (1970-01-01 00:00:00 UTC), то это может быть так же просто, как

values.put("Timestamp", new java.util.Date(ts));

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

values.put("Timestamp", new java.util.Date(ts / 1000 * 1000));

Обратите внимание, что такое преобразование будет использовать текущий часовой пояс виртуальной машины Java (JVM).

person Gord Thompson    schedule 15.09.2018