如何将间隔类型格式化为 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:00
和09: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` 字符串?