如何在 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,其值以"YYYY-MM-dd HH:mm:ss"的形式显示。我需要做什么来转换ts

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

这也指出了显示格式和数据存储与 Jet/ACE 日期值的独立性问题。存储为双精度,整数部分表示自 1899 年 12 月 30 日以来的一天,小数部分表示一天内的时间部分。您输入的任何日期都将仅存储为一个数字。

——大卫·芬顿;2010年7月4日

注意:我知道如何将长整句转换为java.util.Date,设置java.util.Calendar的时间,然后从中获取人类可读/可解析的格式化字符串。这不是我想做的,这就是为什么标记为链接问题的副本是不正确的。我试图做的是获取MS Access理解的双重值。

虽然 Access 确实将日期/时间值存储为浮点数Double但您无需自己执行该转换;杰克塞斯会为你做这件事。只需将java.util.Date传递给Jackcess,它将负责其余的工作。

如果您的长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( 的当前时区。

相关内容

  • 没有找到相关文章