如何将Interval类型格式化为HH:MM格式?

问题描述 投票:0回答:1

我使用的是oracle数据库,列数如下

START_TIME INTERVAL DAY(0) TO SECOND(0)

我在java代码中使用jdbc模板来使用行映射器和getString()方法访问这个值,就像下面这样。(我正在运行一个基本的选择查询来从DB中获取值)

String startTime = rs.getString("START_TIME");

而我得到的值是这样的格式

System.out.println(startTime); // 0 9:30:0.0

我无法将这个值格式化,在 HH:MM 格式字符串。我不需要秒,因为我忽略了这个值。所以我想要的是这样的 09:30

找到了这个,看起来很像 但我正在使用swagger开放API基于yaml的生成DTO,不知道如何才能实现。另外,我没有使用hibernate。是普通的JDBC模板。

EDIT: 观察到当我有 +00 11:00:00.000000 在数据库中, rs.getString("START_TIME") 获取 0 11:0:0.0 而当 +00 09:30:00.000000 它获取 0 9:30:0.0 但我的要求是 11:0009:30. 希望这对你有帮助。

java sql oracle jdbctemplate
1个回答
2
投票

我认为操作字符串值是最简单、最容易的解决方法,所以我将提出另一种解决方案。

从Oracle文档中的 INTERVAL DAY TO SECOND数据类型 而从列的定义来看 START_TIME 在你的问题中,列值不能超过一天,也不能包含小数点的秒。

从Oracle JDBC文档,数据类型 INTERVAL DAY TO SECOND 映射到java类 oracle.sql.INTERVALDS. 这是Oracle JDBC驱动JAR文件中的一个类)。

javadoc 级别的 oracle.sql.INTERVALDS:

该对象的内部数据以11个字节的阵列形式存储在超级类的存储区。字节排列如下。

 Byte       Represents
   0         High byte of day
   1         2nd high byte of day
   2         3rd high byte of day
   3         least byte of day   
   4         hour val + 60     
   5         min + 60
   6         sec + 60
   7         High byte of Fractional second
   8         2nd high byte of Fractional Second
   9         3rd high byte of Fractional Second
   10        least byte of Fractional Second

你知道只有字节4、5、6是相关的,因为列的定义是: START_TIME即零天和零分秒。但由于你在问题中写道你忽略了秒,这意味着只有字节4和5是相关的。因此,从寄存器中检索值的代码是这样的 ResultSet 并将其转换为您所需格式的字符串。

INTERVALDS intervalDS = (INTERVALDS) rs.getObject("START_TIME");
byte[] bytes = intervalDS.toBytes();
int hour = bytes[4] - 60;
int minute = bytes[5] - 60;
String result = String.format("%02d:%02d", hour, minute);

0
投票

找出从第一个空格字符后到第二个空格字符的子串。: 冒号字符,并用0左键填充,使其长度为5个字符。

public static String getHoursMinutesFromInterval( final String time )
{
  String hhmm = time.replaceAll( "^0 (\\d{1,2}:\\d{2}):\\d+\\.\\d+$", "0$1" );
  if ( hhmm.length() > 5 )
  {
    hhmm = hhmm.substring(1, 6);
  }
  return hhmm;
}
© www.soinside.com 2019 - 2024. All rights reserved.