📄 datetimeconverter.java
字号:
// Handle Long
if (value instanceof Long) {
Long longObj = (Long)value;
return toDate(targetType, longObj.longValue());
}
// Convert all other types to String & handle
String stringValue = value.toString().trim();
if (stringValue.length() == 0) {
return handleMissing(targetType);
}
// Parse the Date/Time
if (useLocaleFormat) {
Calendar calendar = null;
if (patterns != null && patterns.length > 0) {
calendar = parse(sourceType, targetType, stringValue);
} else {
DateFormat format = getFormat(locale, timeZone);
calendar = parse(sourceType, targetType, stringValue, format);
}
if (Calendar.class.isAssignableFrom(targetType)) {
return calendar;
} else {
return toDate(targetType, calendar.getTime().getTime());
}
}
// Default String conversion
return toDate(targetType, stringValue);
}
/**
* Convert a long value to the specified Date type for this
* <i>Converter</i>.
* <p>
*
* This method handles conversion to the following types:
* <ul>
* <li><code>java.util.Date</code></li>
* <li><code>java.util.Calendar</code></li>
* <li><code>java.sql.Date</code></li>
* <li><code>java.sql.Time</code></li>
* <li><code>java.sql.Timestamp</code></li>
* </ul>
*
* @param type The Date type to convert to
* @param value The long value to convert.
* @return The converted date value.
*/
private Object toDate(Class type, long value) {
// java.util.Date
if (type.equals(Date.class)) {
return new Date(value);
}
// java.sql.Date
if (type.equals(java.sql.Date.class)) {
return new java.sql.Date(value);
}
// java.sql.Time
if (type.equals(java.sql.Time.class)) {
return new java.sql.Time(value);
}
// java.sql.Timestamp
if (type.equals(java.sql.Timestamp.class)) {
return new java.sql.Timestamp(value);
}
// java.util.Calendar
if (type.equals(Calendar.class)) {
Calendar calendar = null;
if (locale == null && timeZone == null) {
calendar = Calendar.getInstance();
} else if (locale == null) {
calendar = Calendar.getInstance(timeZone);
} else if (timeZone == null) {
calendar = Calendar.getInstance(locale);
} else {
calendar = Calendar.getInstance(timeZone, locale);
}
calendar.setTime(new Date(value));
calendar.setLenient(false);
return calendar;
}
String msg = toString(getClass()) + " cannot handle conversion to '"
+ toString(type) + "'";
if (log().isWarnEnabled()) {
log().warn(" " + msg);
}
throw new ConversionException(msg);
}
/**
* Default String to Date conversion.
* <p>
* This method handles conversion from a String to the following types:
* <ul>
* <li><code>java.sql.Date</code></li>
* <li><code>java.sql.Time</code></li>
* <li><code>java.sql.Timestamp</code></li>
* </ul>
* <p>
* <strong>N.B.</strong> No default String conversion
* mechanism is provided for <code>java.util.Date</code>
* and <code>java.util.Calendar</code> type.
*
* @param type The Number type to convert to
* @param value The String value to convert.
* @return The converted Number value.
*/
private Object toDate(Class type, String value) {
// java.sql.Date
if (type.equals(java.sql.Date.class)) {
try {
return java.sql.Date.valueOf(value);
} catch (IllegalArgumentException e) {
throw new ConversionException(
"String must be in JDBC format [yyyy-MM-dd] to create a java.sql.Date");
}
}
// java.sql.Time
if (type.equals(java.sql.Time.class)) {
try {
return java.sql.Time.valueOf(value);
} catch (IllegalArgumentException e) {
throw new ConversionException(
"String must be in JDBC format [HH:mm:ss] to create a java.sql.Time");
}
}
// java.sql.Timestamp
if (type.equals(java.sql.Timestamp.class)) {
try {
return java.sql.Timestamp.valueOf(value);
} catch (IllegalArgumentException e) {
throw new ConversionException(
"String must be in JDBC format [yyyy-MM-dd HH:mm:ss.fffffffff] " +
"to create a java.sql.Timestamp");
}
}
String msg = toString(getClass()) + " does not support default String to '"
+ toString(type) + "' conversion.";
if (log().isWarnEnabled()) {
log().warn(" " + msg);
log().warn(" (N.B. Re-configure Converter or use alternative implementation)");
}
throw new ConversionException(msg);
}
/**
* Return a <code>DateFormat<code> for the Locale.
* @param locale The Locale to create the Format with (may be null)
* @param timeZone The Time Zone create the Format with (may be null)
*
* @return A Date Format.
*/
protected DateFormat getFormat(Locale locale, TimeZone timeZone) {
DateFormat format = null;
if (locale == null) {
format = DateFormat.getDateInstance(DateFormat.SHORT);
} else {
format = DateFormat.getDateInstance(DateFormat.SHORT, locale);
}
if (timeZone != null) {
format.setTimeZone(timeZone);
}
return format;
}
/**
* Create a date format for the specified pattern.
*
* @param pattern The date pattern
* @return The DateFormat
*/
private DateFormat getFormat(String pattern) {
DateFormat format = new SimpleDateFormat(pattern);
if (timeZone != null) {
format.setTimeZone(timeZone);
}
return format;
}
/**
* Parse a String date value using the set of patterns.
*
* @param sourceType The type of the value being converted
* @param targetType The type to convert the value to.
* @param value The String date value.
*
* @return The converted Date object.
* @throws Exception if an error occurs parsing the date.
*/
private Calendar parse(Class sourceType, Class targetType, String value) throws Exception {
Exception firstEx = null;
for (int i = 0; i < patterns.length; i++) {
try {
DateFormat format = getFormat(patterns[i]);
Calendar calendar = parse(sourceType, targetType, value, format);
return calendar;
} catch (Exception ex) {
if (firstEx == null) {
firstEx = ex;
}
}
}
if (patterns.length > 1) {
throw new ConversionException("Error converting '" + toString(sourceType) + "' to '" + toString(targetType)
+ "' using patterns '" + displayPatterns + "'");
} else {
throw firstEx;
}
}
/**
* Parse a String into a <code>Calendar</code> object
* using the specified <code>DateFormat</code>.
*
* @param sourceType The type of the value being converted
* @param targetType The type to convert the value to
* @param value The String date value.
* @param format The DateFormat to parse the String value.
*
* @return The converted Calendar object.
* @throws ConversionException if the String cannot be converted.
*/
private Calendar parse(Class sourceType, Class targetType, String value, DateFormat format) {
logFormat("Parsing", format);
format.setLenient(false);
ParsePosition pos = new ParsePosition(0);
Date parsedDate = format.parse(value, pos); // ignore the result (use the Calendar)
if (pos.getErrorIndex() >= 0 || pos.getIndex() != value.length() || parsedDate == null) {
String msg = "Error converting '" + toString(sourceType) + "' to '" + toString(targetType) + "'";
if (format instanceof SimpleDateFormat) {
msg += " using pattern '" + ((SimpleDateFormat)format).toPattern() + "'";
}
if (log().isDebugEnabled()) {
log().debug(" " + msg);
}
throw new ConversionException(msg);
}
Calendar calendar = format.getCalendar();
return calendar;
}
/**
* Provide a String representation of this date/time converter.
*
* @return A String representation of this date/time converter
*/
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(toString(getClass()));
buffer.append("[UseDefault=");
buffer.append(isUseDefault());
buffer.append(", UseLocaleFormat=");
buffer.append(useLocaleFormat);
if (displayPatterns != null) {
buffer.append(", Patterns={");
buffer.append(displayPatterns);
buffer.append('}');
}
if (locale != null) {
buffer.append(", Locale=");
buffer.append(locale);
}
if (timeZone != null) {
buffer.append(", TimeZone=");
buffer.append(timeZone);
}
buffer.append(']');
return buffer.toString();
}
/**
* Log the <code>DateFormat<code> creation.
* @param action The action the format is being used for
* @param format The Date format
*/
private void logFormat(String action, DateFormat format) {
if (log().isDebugEnabled()) {
StringBuffer buffer = new StringBuffer(45);
buffer.append(" ");
buffer.append(action);
buffer.append(" with Format");
if (format instanceof SimpleDateFormat) {
buffer.append("[");
buffer.append(((SimpleDateFormat)format).toPattern());
buffer.append("]");
}
buffer.append(" for ");
if (locale == null) {
buffer.append("default locale");
} else {
buffer.append("locale[");
buffer.append(locale);
buffer.append("]");
}
if (timeZone != null) {
buffer.append(", TimeZone[");
buffer.append(timeZone);
buffer.append("]");
}
log().debug(buffer.toString());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -