content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *    http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.arrow.driver.jdbc.utils;
  
  import java.time.Duration;
  import java.time.Period;
  import org.apache.arrow.vector.util.DateUtility;
  
  /**
   * Utility class to format periods similar to Oracle's representation of "INTERVAL * to *" data
   * type.
   */
  public final class IntervalStringUtils {
  
    /** Constructor Method of class. */
    private IntervalStringUtils() {}
  
    /**
     * Formats a period similar to Oracle INTERVAL YEAR TO MONTH data type<br>
     * . For example, the string "+21-02" defines an interval of 21 years and 2 months.
     */
    public static String formatIntervalYear(final Period p) {
      long months = p.toTotalMonths();
      boolean neg = false;
      if (months < 0) {
        months = -months;
        neg = true;
      }
      final int years = (int) (months / DateUtility.yearsToMonths);
      months = months % DateUtility.yearsToMonths;
  
      return String.format("%c%03d-%02d", neg ? '-' : '+', years, months);
    }
  
    /**
     * Formats a period similar to Oracle INTERVAL DAY TO SECOND data type.<br>
     * . For example, the string "-001 18:25:16.766" defines an interval of - 1 day 18 hours 25
     * minutes 16 seconds and 766 milliseconds.
     */
    public static String formatIntervalDay(final Duration d) {
      long millis = d.toMillis();
  
      boolean neg = false;
      if (millis < 0) {
        millis = -millis;
        neg = true;
      }
  
      final int days = (int) (millis / DateUtility.daysToStandardMillis);
      millis = millis % DateUtility.daysToStandardMillis;
  
      final int hours = (int) (millis / DateUtility.hoursToMillis);
      millis = millis % DateUtility.hoursToMillis;
  
      final int minutes = (int) (millis / DateUtility.minutesToMillis);
      millis = millis % DateUtility.minutesToMillis;
  
      final int seconds = (int) (millis / DateUtility.secondsToMillis);
      millis = millis % DateUtility.secondsToMillis;
  
      return String.format(
          "%c%03d %02d:%02d:%02d.%03d", neg ? '-' : '+', days, hours, minutes, seconds, millis);
    }
  }
  