我有以下代码:
// 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( 的当前时区。