Как мне конвертировать из длинного в значение даты / времени доступа в Jackcess? - PullRequest
0 голосов
/ 14 сентября 2018

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

// 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.12.1899, и десятичной частью временную часть в течение дня.Любая введенная вами дата будет сохранена как одно число.

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

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

1 Ответ

0 голосов
/ 16 сентября 2018

Хотя 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).

...