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