处理时间类型时,最大的问题就是带时区的时间类型
例如Oracle的以下三个时间类型,是在Oracle的包下面的类型,其他数据库就不识别
import oracle.sql.TIMESTAMP;
import oracle.sql.TIMESTAMPLTZ;
import oracle.sql.TIMESTAMPTZ;
需要转化成java的带时区时间类型:
java.time.OffsetDateTime;
sqlservice的 DateTimeOffset 同理
- /**
- * 将sql返回集转为 List
- *
- * @param rs
- * @return
- */
- @Override
- public List
- // 得到列的个数
- List
- try {
- ResultSetMetaData rsmd = rs.getMetaData();
- int colCount = rsmd.getColumnCount();
- // 因为要存储列的名字,所以要与列的个数相同
- String[] colNames = new String[colCount];
-
- /* 装上列的名字
- * getColumnLabel 别名
- * getColumnLabel()方法的索引是从1开始的。给最苦 写成从0开始,就抛了异常。
- */
- for (int i = 1; i <= colCount; i++) {
- colNames[i - 1] = rsmd.getColumnLabel(i);
- }
-
- // 这里的泛型声明也是有技巧的。
- HashMap
data = null; -
- // 把查询到的结果装入datas中
- while (rs.next()) {
- data = new HashMap
(); - for (int i = 0; i < colCount; i++) {
- //此种带时区的时间类型单独处理
- if (object instanceof TIMESTAMPLTZ || object instanceof TIMESTAMPTZ) {
- // key value
- OffsetDateTime offsetDateTime = rs.getObject(colNames[m], OffsetDateTime.class);
- data.put(colNames[m], offsetDateTime);
- } else if (object instanceof TIMESTAMP) {
- LocalDateTime localDateTime = rs.getObject(colNames[m], LocalDateTime.class);
- data.put(colNames[m], localDateTime);
- } else if (object instanceof DateTimeOffset) {
- OffsetDateTime offsetDateTime = ((DateTimeOffset) object).getOffsetDateTime();
- data.put(colNames[m], offsetDateTime);
- } else {
- // key value
- data.put(colNames[m], object);
- }
- }
- datas.add(data);
- }
- } catch (Exception e) {
- log.error(ExceptionUtil.getStackTrace(e));
- throw new DtsException(e.getMessage());
- }
- return datas;
- }