`

zk注解日期时间转换类

    博客分类:
  • 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);
	}
}
0
2
分享到:
评论

相关推荐

    ZK数据绑定

    这在处理不同类型的数据显示或处理用户输入时非常有用,例如将日期字符串转换为日期对象,或将货币数值格式化为指定的格式。 6. 表达式语言:ZK支持一种称为ZK EL(ZK Expression Language)的表达式语言,用于在...

    Java 8 API

    - **java.time包**:取代了旧的java.util.Date和Calendar,提供了更加易用、强大的日期和时间处理功能,如LocalDate、LocalTime、LocalDateTime、ZonedDateTime等类。 3. **默认方法**: - 接口中引入了默认方法...

    JAVA上百实例源码以及开源项目源代码

    Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择 Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] ...

    PDF文件合并生成工具

    使用这种工具,用户无需将PDF转换为其他格式(如Word),从而避免了格式转换可能导致的排版失真问题。 PDF文件的合并过程通常包括以下几个步骤: 1. **导入文件**:首先,用户需要选择要合并的PDF文档。大多数PDF...

    java开源包1

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包11

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包2

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包3

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包6

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包5

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包10

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包4

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包8

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包7

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包9

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包101

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    Java资源包01

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

Global site tag (gtag.js) - Google Analytics