?? datetimeconverter.java
字號:
/*
* 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.commons.beanutils.converters;
import java.util.Date;
import java.util.Locale;
import java.util.Calendar;
import java.util.TimeZone;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;
import org.apache.commons.beanutils.ConversionException;
/**
* {@link org.apache.commons.beanutils.Converter} implementaion
* that handles conversion to and from <b>date/time</b> objects.
* <p>
* This implementation handles conversion for the following
* <i>date/time</i> 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>
*
* <h3>String Conversions (to and from)</h3>
* This class provides a number of ways in which date/time
* conversions to/from Strings can be achieved:
* <ul>
* <li>Using the SHORT date format for the default Locale, configure using:</li>
* <ul>
* <li><code>setUseLocaleFormat(true)</code></li>
* </ul>
* <li>Using the SHORT date format for a specified Locale, configure using:</li>
* <ul>
* <li><code>setLocale(Locale)</code></li>
* </ul>
* <li>Using the specified date pattern(s) for the default Locale, configure using:</li>
* <ul>
* <li>Either <code>setPattern(String)</code> or
* <code>setPatterns(String[])</code></li>
* </ul>
* <li>Using the specified date pattern(s) for a specified Locale, configure using:</li>
* <ul>
* <li><code>setPattern(String)</code> or
* <code>setPatterns(String[]) and...</code></li>
* <li><code>setLocale(Locale)</code></li>
* </ul>
* <li>If none of the above are configured the
* <code>toDate(String)</code> method is used to convert
* from String to Date and the Dates's
* <code>toString()</code> method used to convert from
* Date to String.</li>
* </ul>
*
* <p>
* The <b>Time Zone</b> to use with the date format can be specified
* using the <code>setTimeZone()</code> method.
*
* @version $Revision: 640131 $ $Date: 2008-03-23 02:10:31 +0000 (Sun, 23 Mar 2008) $
* @since 1.8.0
*/
public abstract class DateTimeConverter extends AbstractConverter {
private String[] patterns;
private String displayPatterns;
private Locale locale;
private TimeZone timeZone;
private boolean useLocaleFormat;
// ----------------------------------------------------------- Constructors
/**
* Construct a Date/Time <i>Converter</i> that throws a
* <code>ConversionException</code> if an error occurs.
*/
public DateTimeConverter() {
super();
}
/**
* Construct a Date/Time <i>Converter</i> that returns a default
* value if an error occurs.
*
* @param defaultValue The default value to be returned
* if the value to be converted is missing or an error
* occurs converting the value.
*/
public DateTimeConverter(Object defaultValue) {
super(defaultValue);
}
// --------------------------------------------------------- Public Methods
/**
* Indicate whether conversion should use a format/pattern or not.
*
* @param useLocaleFormat <code>true</code> if the format
* for the locale should be used, otherwise <code>false</code>
*/
public void setUseLocaleFormat(boolean useLocaleFormat) {
this.useLocaleFormat = useLocaleFormat;
}
/**
* Return the Time Zone to use when converting dates
* (or <code>null</code> if none specified.
*
* @return The Time Zone.
*/
public TimeZone getTimeZone() {
return timeZone;
}
/**
* Set the Time Zone to use when converting dates.
*
* @param timeZone The Time Zone.
*/
public void setTimeZone(TimeZone timeZone) {
this.timeZone = timeZone;
}
/**
* Return the Locale for the <i>Converter</i>
* (or <code>null</code> if none specified).
*
* @return The locale to use for conversion
*/
public Locale getLocale() {
return locale;
}
/**
* Set the Locale for the <i>Converter</i>.
*
* @param locale The Locale.
*/
public void setLocale(Locale locale) {
this.locale = locale;
setUseLocaleFormat(true);
}
/**
* Set a date format pattern to use to convert
* dates to/from a <code>java.lang.String</code>.
*
* @see SimpleDateFormat
* @param pattern The format pattern.
*/
public void setPattern(String pattern) {
setPatterns(new String[] {pattern});
}
/**
* Return the date format patterns used to convert
* dates to/from a <code>java.lang.String</code>
* (or <code>null</code> if none specified).
*
* @see SimpleDateFormat
* @return Array of format patterns.
*/
public String[] getPatterns() {
return patterns;
}
/**
* Set the date format patterns to use to convert
* dates to/from a <code>java.lang.String</code>.
*
* @see SimpleDateFormat
* @param patterns Array of format patterns.
*/
public void setPatterns(String[] patterns) {
this.patterns = patterns;
if (patterns != null && patterns.length > 1) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < patterns.length; i++) {
if (i > 0) {
buffer.append(", ");
}
buffer.append(patterns[i]);
}
displayPatterns = buffer.toString();
}
setUseLocaleFormat(true);
}
// ------------------------------------------------------ Protected Methods
/**
* Convert an input Date/Calendar object into a String.
* <p>
* <b>N.B.</b>If the converter has been configured to with
* one or more patterns (using <code>setPatterns()</code>), then
* the first pattern will be used to format the date into a String.
* Otherwise the default <code>DateFormat</code> for the default locale
* (and <i>style</i> if configured) will be used.
*
* @param value The input value to be converted
* @return the converted String value.
* @throws Throwable if an error occurs converting to a String
*/
protected String convertToString(Object value) throws Throwable {
Date date = null;
if (value instanceof Date) {
date = (Date)value;
} else if (value instanceof Calendar) {
date = ((Calendar)value).getTime();
} else if (value instanceof Long) {
date = new Date(((Long)value).longValue());
}
String result = null;
if (useLocaleFormat && date != null) {
DateFormat format = null;
if (patterns != null && patterns.length > 0) {
format = getFormat(patterns[0]);
} else {
format = getFormat(locale, timeZone);
}
logFormat("Formatting", format);
result = format.format(date);
if (log().isDebugEnabled()) {
log().debug(" Converted to String using format '" + result + "'");
}
} else {
result = value.toString();
if (log().isDebugEnabled()) {
log().debug(" Converted to String using toString() '" + result + "'");
}
}
return result;
}
/**
* Convert the input object into a Date object of the
* specified type.
* <p>
* This method handles conversions between 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>
*
* It also handles conversion from a <code>String</code> to
* any of the above types.
* <p>
*
* For <code>String</code> conversion, if the converter has been configured
* with one or more patterns (using <code>setPatterns()</code>), then
* the conversion is attempted with each of the specified patterns.
* Otherwise the default <code>DateFormat</code> for the default locale
* (and <i>style</i> if configured) will be used.
*
* @param targetType Data type to which this value should be converted.
* @param value The input value to be converted.
* @return The converted value.
* @throws Exception if conversion cannot be performed successfully
*/
protected Object convertToType(Class targetType, Object value) throws Exception {
Class sourceType = value.getClass();
// Handle java.sql.Timestamp
if (value instanceof java.sql.Timestamp) {
// ---------------------- JDK 1.3 Fix ----------------------
// N.B. Prior to JDK 1.4 the Timestamp's getTime() method
// didn't include the milliseconds. The following code
// ensures it works consistently accross JDK versions
java.sql.Timestamp timestamp = (java.sql.Timestamp)value;
long timeInMillis = ((timestamp.getTime() / 1000) * 1000);
timeInMillis += timestamp.getNanos() / 1000000;
// ---------------------- JDK 1.3 Fix ----------------------
return toDate(targetType, timeInMillis);
}
// Handle Date (includes java.sql.Date & java.sql.Time)
if (value instanceof Date) {
Date date = (Date)value;
return toDate(targetType, date.getTime());
}
// Handle Calendar
if (value instanceof Calendar) {
Calendar calendar = (Calendar)value;
return toDate(targetType, calendar.getTime().getTime());
}
// Handle Long
if (value instanceof Long) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -