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

Posted

技术标签:

【中文标题】如何将间隔类型格式化为 HH:MM 格式?【英文标题】:How to format Interval type to HH:MM format? 【发布时间】:2020-05-29 11:27:21 【问题描述】:

我在下面的列中使用 oracle DB

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

Found this which looks similar 但我正在为 DTO 使用基于 yaml 的 swagger 开放 API 生成,但不知道如何实现这一点。另外,我没有使用休眠。它是普通的 JDBC 模板。

编辑: 观察到当我在 DB 中有 +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。希望这会有所帮助。

【问题讨论】:

所以,让我看看我是否有你的问题,你有一个类似 "09:30:0.0" 的字符串,但你需要一些东西像 "09:30" ? 你会得到 1 天或更长时间的间隔吗? @ΦXocę웃Пepeúpaツ 我有一串 0 9:30:0.0 我想要 09:30 我尝试了字符串操作,但我我不确定这是否是最好的方法。不确定我是否正确处理了 oracle 的间隔类型。 @MT0 不,这不会发生。这只是大约小时和分钟。这就是为什么我们有 DAY(0) 这就是我问的原因。如果您希望将1 9:30 输出为33:30,那么这与将0 X:YY 转换为0X:YY 是完全不同的解决方案。 【参考方案1】:

我相信操作字符串值是最简单最简单的解决方案,所以我将提出一个替代解决方案。

根据INTERVAL DAY TO SECOND data type 的Oracle 文档和问题中START_TIME 列的定义,列值不能超过一天,也不能包含小数秒。

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

来自oracle.sql.INTERVALDS类的javadoc

该对象的内部数据以 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);

【讨论】:

这在一定程度上起到了作用,但是当数据库有+00 11:00:00.000000 rs.getObject("START_TIME") 获取0 11:0:0.0 但我想要11:00 这有什么线索吗? @Sudhanshu rs.getObject("START_TIME") 获取0 11:0:0.0。它获取一个对象。更准确地说,它获取oracle.sql.INTERVALDS 的一个实例。对象的字符串表示为0 11:0:0.0 同意,我在上面尝试了 Syso,它给了我0 11:0:0.0,如果你可以在问题中看到我的编辑,那么我仍然面临这种方法的问题。因此,例如,我得到的是11:0 而不是11:00,而对于09:30,我得到的是9:30 bytes[x] - 60【参考方案2】:

查找从第一个空格字符到第二个: 冒号字符的子字符串,并用零填充它,使其长度为 5 个字符。

public static String getHoursMinutesFromInterval( final String time )

  String hhmm = time.replaceAll( "^0 (\\d1,2:\\d2):\\d+\\.\\d+$", "0$1" );
  if ( hhmm.length() > 5 )
  
    hhmm = hhmm.substring(1, 6);
  
  return hhmm;

【讨论】:

我仍然收到11:0 你能检查我在问题中的编辑吗?希望它会增加一些价值。

以上是关于如何将间隔类型格式化为 HH:MM 格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在新的 Google 表格中将持续时间格式化为 HH:mm

如何使用 NodeJS 将 UTC 日期格式化为 `YYYY-MM-DD hh:mm:ss` 字符串?

如何使用 DateComponentsFormatter 在 HH:MM 中格式化从 00:00 开始的时间间隔偏移量

将Android EditText格式化为HH:MM:SS

js实现将秒数格式化为HH:MM:SS的形式

java中如何将string类型格式化为Timestamp类型的时间,只要时分秒不要年月日?