struts 2英語版の日付の提出ミスについて


【転載】:英語環境でStruts 2日付フォーマット変換の問題
住所:http://blog.csdn.net/liuzhenfeng/article/details/6605045
Struts 2を使って開発する過程で、私達はよくStruts 2の持参するタイプのコンバータを使って、これらのタイプのコンバータも本当に簡略化して私達の開発を行って、しかし、時にはそれらもいくつか問題が現れます.例えば、
<input id=「startTime」name=「startTime」  readonly onfocus=「WdatePicker()」
      value=「{startTime}」(日付フォーマットは「yyy-M-dd」に設定)
アクションの属性は、prvate Date startTimeと定義されている.
このように中国語環境(locale)のシステムでは問題ないですが、英語環境のシステムでは異常があります.理由は英語環境に「yyyy-M-dd」形式の日付がないため、変換過程に異常があるからです.
異常の原因がわかったら、解決方法があります.日付変換器を書いてください.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import ognl.DefaultTypeConverter;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;

public class DateConverter extends DefaultTypeConverter {

	private static final Logger logger = Logger.getLogger(DateConverter.class);

	private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

	private static final String DATE_PATTERN = "yyyy-MM-dd";

	private static final String MONTH_PATTERN = "yyyy-MM";

	/**
	 * Convert value between types
	 */
	@SuppressWarnings("unchecked")
	public Object convertValue(Map ognlContext, Object value, Class toType) {
		Object result = null;
		if (toType == Date.class) {
			try {
				result = doConvertToDate(value);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else if (toType == String.class) {
			result = doConvertToString(value);
		}
		return result;
	}

	/**
	 * Convert String to Date
	 * 
	 * @param value
	 * @return
	 * @throws ParseException
	 */
	private Date doConvertToDate(Object value) throws ParseException {
		Date result = null;

		if (value instanceof String) {
			result = DateUtils.parseDate((String) value, new String[] {
					DATE_PATTERN, DATETIME_PATTERN, MONTH_PATTERN });

			// all patterns failed, try a milliseconds constructor
			if (result == null && StringUtils.isNotEmpty((String) value)) {

				try {
					result = new Date(new Long((String) value).longValue());
				} catch (Exception e) {
					logger.error("Converting from milliseconds to Date fails!");
					e.printStackTrace();
				}

			}

		} else if (value instanceof Object[]) {
			// let's try to convert the first element only
			Object[] array = (Object[]) value;

			if ((array != null) && (array.length >= 1)) {
				value = array[0];
				result = doConvertToDate(value);
			}

		} else if (Date.class.isAssignableFrom(value.getClass())) {
			result = (Date) value;
		}
		return result;
	}

	/**
	 * Convert Date to String
	 * 
	 * @param value
	 * @return
	 */
	private String doConvertToString(Object value) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
				DATETIME_PATTERN);
		String result = null;
		if (value instanceof Date) {
			result = simpleDateFormat.format(value);
		}
		return result;
	}
}
この変換器をグローバルに登録することができます.classipathの下でxwork-conversion.propertiesファイルを作成します.内容は:java.util.Date=cn.anycal.com nversion.DateConterです.
また、struts.xmlに直接定数を定義して、localeを「zhuCN」に設定しても解決できるという人がいます.
補足説明:
プロジェクトでは、他の同僚と会って、「yyyy-M-dd HH:mm:ss」でフォーマットしています.提出する時はいつも異常です.
後に転化をする時、stringのtrimで前後のスペースを削る必要があります.