如何将间隔类型格式化为hh:mm格式?

r55awzrz  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(323)

我正在使用下面列的oracle数据库 START_TIME INTERVAL DAY(0) TO SECOND(0) 我在java代码中使用jdbc模板,使用行Map器和getstring()方法访问这个值,如下所示:(我运行一个基本的select查询,从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模板。
编辑:观察到当我 +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:00 以及 09:30 . 希望这能多帮点忙。

8iwquhpp

8iwquhpp1#

我相信操纵字符串值是最简单的解决方案,因此我将提供一个替代解决方案。
从oracle文档中的间隔日到第二个数据类型和列的定义 START_TIME 在您的问题中,列值不能跨越一天以上,也不能包含小数秒。
在oraclejdbc文档中,数据类型 INTERVAL DAY TO SECOND Map到java类 oracle.sql.INTERVALDS . (这是oraclejdbc驱动程序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);
sycxhyv7

sycxhyv72#

查找从第一个空格字符到第二个空格字符之间的子字符串 : 冒号字符,并用零填充它,使其长度为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;
}

相关问题