如何在 Jackcess 中将 long 值转换为 Access Date/Time 值?

How do I convert from a long to an Access Date/Time value in 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 中 "Timestamp" 列的类型是 Date/Time,其值以 "YYYY-MM-dd HH:mm:ss" 的形式显示。我需要做什么才能转换 ts?

This answer 到一个类似的问题提到转换为 double(根据来源,这是 Access 用来存储 Date/Time 字段的内容),但我没有不明白我需要对我的代码做些什么才能符合它:

This also points up the issue of the independence of display format and data storage with Jet/ACE date values. The storage is as a double, with the integer part indicating the day since 12/30/1899 and the decimal part the time portion within the day. Any date you enter is going to be stored as only one number.

David W. Fenton; 2010 年 7 月 4 日

注:我知道how to convert a long to a java.util.Date, set the time for a java.util.Calendar, then get a human-readable/parsable formatted String from it。那不是我想要做的,这就是为什么标记为链接问题的副本是不正确的。我想要做的是获得 MS Access 理解的双精度值。

虽然 Access 确实将 Date/Time 值存储为 Double 浮点数,但您不需要自己进行该转换; Jackcess 会为你做这件事。只需将 java.util.Date 传递给 Jackcess,它将处理其余部分。

如果你的 long 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) 的当前时区。