/*
* 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 java.sql;
import java.util.Date;
/**
* Java representation of an SQL {@code TIME} value. Provides utilities to
* format and parse the time's representation as a String in JDBC escape format.
*/
public class Time extends Date {
private static final long serialVersionUID = 8397324403548013681L;
/**
* Constructs a {@code Time} object using the supplied values for <i>Hour</i>,
* <i>Minute</i> and <i>Second</i>. The <i>Year</i>, <i>Month</i> and
* <i>Day</i> elements of the {@code Time} object are set to the date
* of the Epoch (January 1, 1970).
* <p>
* Any attempt to access the <i>Year</i>, <i>Month</i> or <i>Day</i>
* elements of a {@code Time} object will result in an {@code
* IllegalArgumentException}.
* <p>
* The result is undefined if any argument is out of bounds.
*
* @deprecated Use the constructor {@link #Time(long)} instead.
* @param theHour
* a value in the range {@code [0,23]}.
* @param theMinute
* a value in the range {@code [0,59]}.
* @param theSecond
* a value in the range {@code [0,59]}.
*/
@SuppressWarnings("deprecation")
@Deprecated
public Time(int theHour, int theMinute, int theSecond) {
super(70, 0, 1, theHour, theMinute, theSecond);
}
/**
* Constructs a {@code Time} object using a supplied time specified in
* milliseconds.
*
* @param theTime
* a {@code Time} specified in milliseconds since the
* <i>Epoch</i> (January 1st 1970, 00:00:00.000).
*/
public Time(long theTime) {
super(theTime);
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a date component.
* @return does not return anything.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public int getDate() {
throw new IllegalArgumentException("unimplemented");
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a day component.
* @return does not return anything.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public int getDay() {
throw new IllegalArgumentException("unimplemented");
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a month component.
* @return does not return anything.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public int getMonth() {
throw new IllegalArgumentException("unimplemented");
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a year component.
* @return does not return anything.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public int getYear() {
throw new IllegalArgumentException("unimplemented");
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a date component.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setDate(int i) {
throw new IllegalArgumentException("unimplemented");
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a month component.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setMonth(int i) {
throw new IllegalArgumentException("unimplemented");
}
/**
* @deprecated This method is deprecated and must not be used. An SQL
* {@code Time} object does not have a year component.
* @throws IllegalArgumentException
* if this method is called.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setYear(int i) {
throw new IllegalArgumentException("unimplemented");
}
/**
* Sets the time for this {@code Time} object to the supplied milliseconds
* value.
*
* @param time
* A time value expressed as milliseconds since the <i>Epoch</i>.
* Negative values are milliseconds before the Epoch. The Epoch
* is January 1 1970, 00:00:00.000.
*/
@Override
public void setTime(long time) {
super.setTime(time);
}
/**
* Formats the {@code Time} as a String in JDBC escape format: {@code
* hh:mm:ss}.
*
* @return A String representing the {@code Time} value in JDBC escape
* format: {@code HH:mm:ss}
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder(8);
format(getHours(), 2, sb);
sb.append(':');
format(getMinutes(), 2, sb);
sb.append(':');
format(getSeconds(), 2, sb);
return sb.toString();
}
private static final String PADDING = "00";
/*
* Private method to format the time
*/
private void format(int date, int digits, StringBuilder sb) {
String str = String.valueOf(date);
if (digits - str.length() > 0) {
sb.append(PADDING.substring(0, digits - str.length()));
}
sb.append(str);
}
/**
* Creates a {@code Time} object from a string holding a time represented in
* JDBC escape format: {@code hh:mm:ss}.
* <p>
* An exception occurs if the input string does not comply with this format.
*
* @param timeString
* A String representing the time value in JDBC escape format:
* {@code hh:mm:ss}.
* @return The {@code Time} object set to a time corresponding to the given
* time.
* @throws IllegalArgumentException
* if the supplied time string is not in JDBC escape format.
*/
public static Time valueOf(String timeString) {
if (timeString == null) {
throw new IllegalArgumentException("timeString == null");
}
int firstIndex = timeString.indexOf(':');
int secondIndex = timeString.indexOf(':', firstIndex + 1);
// secondIndex == -1 means none or only one separator '-' has been
// found.
// The string is separated into three parts by two separator characters,
// if the first or the third part is null string, we should throw
// IllegalArgumentException to follow RI
if (secondIndex == -1 || firstIndex == 0
|| secondIndex + 1 == timeString.length()) {
throw new IllegalArgumentException();
}
// parse each part of the string
int hour = Integer.parseInt(timeString.substring(0, firstIndex));
int minute = Integer.parseInt(timeString.substring(firstIndex + 1,
secondIndex));
int second = Integer.parseInt(timeString.substring(secondIndex + 1,
timeString.length()));
return new Time(hour, minute, second);
}
}