Как отформатировать тип интервала в формат ЧЧ: ММ? - PullRequest
0 голосов
/ 29 мая 2020

Я использую oracle DB со столбцом ниже

START_TIME INTERVAL DAY(0) TO SECOND(0)

Я использую шаблон jdb c в коде java для доступа к этому значению с помощью сопоставителя строк и getString (), как показано ниже: (Я выполняю запрос basi c select для извлечения значений из БД)

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

и получаемое мной значение находится в этом формате

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

Я не могу отформатировать это значение в строке формата HH: MM . Мне не нужны секунды, поскольку я игнорирую это значение. Итак, я хочу что-то вроде этого 09: 30

Нашел это, которое выглядит похоже , но я использую генерацию swagger с открытым API на основе yaml для DTO и не знаю, как я могу этого добиться. Кроме того, я не использую спящий режим. Это простой шаблон JDB C.

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:00 и 09:30. Надеюсь, это поможет еще немного.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020
• 1000 * и из определения столбца START_TIME в вашем вопросе значения столбца не могут охватывать более одного дня и не могут содержать дробные секунды.

Из Oracle JDB C документации , тип данных INTERVAL DAY TO SECOND соответствует классу java oracle.sql.INTERVALDS. (Это один из классов в файле JAR драйвера Oracle JDB C.)

Из javado c класса 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 голосов
/ 29 мая 2020

Найдите подстроку от первого символа пробела до второго : символа двоеточия и дополните его нулем слева, чтобы длина составляла 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;
}
...