zk注解日期时间转换类

   注解日期时间转换类使用到了日期工具类DateUtils

 

 

package org.sunflower.common.web.converter;

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

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.metainfo.Annotation;
import org.zkoss.zk.ui.sys.ComponentCtrl;
import org.zkoss.zkplus.databind.TypeConverter;

import org.sunflower.common.util.CheckExceptionConverter;
import org.sunflower.common.util.DateUtils;

/**
 * 日期时间转换函数
 * <p>
 * {@link #coerceToUi(Object, Component)}支持的格式为
 * <ol>
 * <li>datetime:yyyy-MM-dd HH:mm:ss</li>
 * <li>date:yyyy-MM-dd</li>
 * <li>time:HH:mm:ss</li>
 * <li>自定义:模式规则与<code>java.text.SimpleDateFormat</code>pattern相同</li>
 * </ol>
 * 
 * 例如:默认使用日期时间模式
 * <p>
 * <ol>
 * <li>日期时间模式:&lt;label value="@{account.createTime,converter='org.sunflower.common.web.zk.converter.DatetimeConverter'}"
 * self="@{format('datetime')}"/&gt;
 * <li>日期模式:&lt;label value="@{account.createTime,converter='org.sunflower.common.web.zk.converter.DatetimeConverter'}"
 * self="@{format('date')}"/&gt;
 * <li>时间模式:&lt;label value="@{account.createTime,converter='org.sunflower.common.web.zk.converter.DatetimeConverter'}"
 * self="@{format('time')}"/&gt;
 * <li>自定义模式:&lt;label value="@{account.createTime,converter='org.sunflower.common.web.zk.converter.DatetimeConverter'}"
 * self="@{format('yyyy年MM月dd日 HH时mm分ss秒')}"/&gt;
 * </ol>
 * 
 * @author sunflower
 */
public class DatetimeConverter implements TypeConverter {
	public static final String PATTERN_DATETIME = "datetime";
	public static final String PATTERN_DATE = "date";
	public static final String PATTERN_TIME = "time";
	private static final Logger log = LoggerFactory
			.getLogger(DatetimeConverter.class);

	@Override
	public Object coerceToBean(Object strDatetime, Component comp) {
		// 忽略null string
		if (strDatetime == null) {
			return "";
		}
		// 忽略非String类型日期格式,并错误警告
		if (!(strDatetime instanceof String)) {
			log.error("组件{}绑定的对象应为String类型,您使用的类型是{}!", comp.getClass()
					.getName(), strDatetime.getClass().getName());
			return "";
		}
		String date = (String) strDatetime;
		final Annotation annot = ((ComponentCtrl) comp).getAnnotation("format");
		String pattern = null;
		try {
			if (annot != null) {
				pattern = annot.getAttribute("value");
				if (StringUtils.equalsIgnoreCase(PATTERN_DATETIME, pattern)) {
					return DateUtils.parseDatetime(date);
				} else if (StringUtils.equalsIgnoreCase(PATTERN_DATE, pattern)) {
					return DateUtils.parseDate(date);
				} else if (StringUtils.equalsIgnoreCase(PATTERN_TIME, pattern)) {
					return DateUtils.parseTime(date);
				} else {
					return DateUtils.parseDatetime(date, pattern);
				}
			}
			return DateUtils.parseDatetime(date);
		} catch (ParseException e) {
			throw CheckExceptionConverter.convertToRuntimeException(e);
		}
	}

	@Override
	public Object coerceToUi(Object dt, Component comp) {
		// 忽略null bean,并警告
		if (dt == null) {
			log.warn("组件" + comp.getClass().getSimpleName() + "绑定的日期为null!");
			return "";
		}
		// 忽略非日期类型对象,并错误警告
		if (!(dt instanceof Date)) {
			log.error("组件{}绑定的对象应为java.util.Date类型或者其泛化类,您帮的类型是{}!", comp
					.getClass().getName(), dt.getClass().getName());
			return "";
		}
		Date date = (Date) dt;
		final Annotation annot = ((ComponentCtrl) comp).getAnnotation("format");
		String pattern = null;
		if (annot != null) {
			pattern = annot.getAttribute("value");
			if (StringUtils.equalsIgnoreCase(PATTERN_DATETIME, pattern)) {
				return DateUtils.formatDatetime(date);
			} else if (StringUtils.equalsIgnoreCase(PATTERN_DATE, pattern)) {
				return DateUtils.formatDate(date);
			} else if (StringUtils.equalsIgnoreCase(PATTERN_TIME, pattern)) {
				return DateUtils.formatTime(date);
			} else {
				return DateUtils.formatDatetime(date, pattern);
			}
		}
		return DateUtils.formatDatetime(date);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值