`

BootstrapPlugin - daterangepicker 使用笔记

阅读更多
BootstrapPlugin - daterangepicker 使用笔记

1) 项目中间要用到选择日期范围的控件,因为是基于twitter-bootstrap框架的东西
找到一个插件,自己汉化一下。稍微修改一下源代码即可。(见本文附件)

2) 效果图



3) 因为后端使用的是spring-mvc框架,自己开发一个标注实现数据绑定。(不采用java.util.Date,依赖joda-time.jar)
model:
package com.ztgame.me.ext.model.datetimerange;

import java.io.Serializable;

import org.joda.time.DateTime;

public class DateTimeRange implements Serializable {

	private static final long serialVersionUID = 7099749496174999964L;

	private DateTime startDateTime;
	private DateTime endDateTime;
	
	// ------------------------------------------------------------------------------------
	// 构造方法

	public DateTimeRange() {
		super();
	}

	public DateTimeRange(DateTime startDateTime, DateTime endDateTime) {
		this();
		this.startDateTime = startDateTime;
		this.endDateTime  = endDateTime;
	}

	// ------------------------------------------------------------------------------------

	public DateTime getStartDateTime() {
		return startDateTime;
	}

	public void setStartDateTime(DateTime startDateTime) {
		this.startDateTime = startDateTime;
	}

	public DateTime getEndDateTime() {
		return endDateTime;
	}

	public void setEndDateTime(DateTime endDateTime) {
		this.endDateTime = endDateTime;
	}
}

annotation:
package com.ztgame.me.ext.model.datetimerange;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface DateTimeRangeFormat {

	public String pattern() default "yyyy/MM/dd";

	public String delimiter() default " - ";

}

  AnnotationFormatterFactory
package com.ztgame.me.ext.model.datetimerange;

import java.io.Serializable;
import java.text.ParseException;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.format.AnnotationFormatterFactory;
import org.springframework.format.Formatter;
import org.springframework.format.Parser;
import org.springframework.format.Printer;

public class DateTimeRangeFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<DateTimeRangeFormat> {

	@Override
	public Set<Class<?>> getFieldTypes() {
		Set<Class<?>> fieldTypes = new HashSet<Class<?>>();
		fieldTypes.add(DateTimeRange.class);
		return fieldTypes;
	}

	@Override
	public Printer<?> getPrinter(DateTimeRangeFormat annotation, Class<?> fieldType) {
		return new DateTimeRangeFormatter(annotation.pattern(), annotation.delimiter());
	}

	@Override
	public Parser<?> getParser(DateTimeRangeFormat annotation, Class<?> fieldType) {
		return new DateTimeRangeFormatter(annotation.pattern(), annotation.delimiter());
	}

	// ~============================================================================================================================
	
	private static class DateTimeRangeFormatter implements Formatter<DateTimeRange>, Serializable {

		private static final long serialVersionUID = -818656464607971661L;

		private String delimiter;
		private String pattern;

		public DateTimeRangeFormatter(String pattern, String delimiter) {
			this.pattern = pattern;
			this.delimiter = delimiter;
		}

		@Override
		public String print(DateTimeRange object, Locale locale) {
			StringBuilder sb = new StringBuilder();
			sb.append(object.getStartDateTime().toString(pattern));
			sb.append(delimiter);
			sb.append(object.getEndDateTime().toString(pattern));
			return sb.toString();
		}

		@Override
		public DateTimeRange parse(String text, Locale locale) throws ParseException {
			String[] ps = text.split(delimiter);

			DateTimeFormatter format = DateTimeFormat.forPattern(pattern);
			DateTime startDateTime = format.parseDateTime(ps[0]);
			DateTime endDateTime   = format.parseDateTime(ps[1]);
			return new DateTimeRange(startDateTime, endDateTime);
		}
	}
}

spring-mvc 配置
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	<property name="converters">
		<list>
			<!-- 其他自己实现的converter,跟本列子无关 -->
		</list>
	</property>
	<property name="formatters">
		<list>
			<bean class="com.ztgame.me.ext.model.datetimerange.DateTimeRangeFormatAnnotationFormatterFactory" />
		</list>
	</property>
</bean>

这样一来,就可以吧诸如"1985/06/22 - 2012/11/13"这样的字符串直接绑定到DateTimeRange类上,很方便。

4) 参考资料
插件官网
张开涛SpringMVC教程
bootstrap-daterangepicker.js依赖的date.js官方教程
分享到:
评论
1 楼 forcer521 2013-03-05  
有几个问题请教下:
1、 如何限制日期选择范围,比如只能选择90之内或3个自然月之内?
2、 怎么控制布局,把确定取消按钮移到最右边呢?

相关推荐

    BootstrapPlugin - typeahead-ex 使用笔记

    在本篇笔记中,我们将深入探讨其主要特性、用法以及如何在项目中集成和定制。 首先,Bootstrap的typeahead基础功能是根据用户输入的字符动态显示匹配的建议列表。typeahead-ex则进一步增强了这个功能,它支持异步...

    BootstrapPlugin - wysihtml5 使用笔记

    在使用BootstrapPlugin - wysihtml5 时,首先需要在页面中引入相关的CSS和JavaScript文件,包括Bootstrap的样式表和wysihtml5的脚本。接着,创建一个`&lt;textarea&gt;`元素,然后通过JavaScript初始化编辑器,将其绑定到...

    material-ui-datetime-range-picker:基于Material-UI构建的日期时间范围选择器

    npm install material-ui-datetime-range-picker笔记这项工作仍在进行中,请您自担风险。 我添加了一些基本文档。 有许多属性需要抽象为一个参数,还需要完成其他工作。 请注意,这使用Material UI版本0.2,并且...

    BootstrapPlugin - editable 使用笔记

    在使用BootstrapPlugin - editable时,你需要了解以下关键知识点: 1. **安装与引入**: 首先,确保你的项目已经包含了Bootstrap库和jQuery,因为editable插件依赖于这两个库。然后,你可以通过CDN或者本地文件...

    BootstrapPlugin - prettyCheckable 使用笔记

    在阅读博客文章“BootstrapPlugin - prettyCheckable 使用笔记”(链接:https://yingzhuo.iteye.com/blog/1740617)时,你可能会了解更多关于这个插件的高级用法、注意事项和实际案例。博主应会详细讲解如何在实际...

    BootstrapPlugin - datepicker 使用笔记

    这篇博客文章《BootstrapPlugin - datepicker 使用笔记》将深入探讨如何集成和使用这个插件。 首先,要在项目中使用bootstrap-datepicker,你需要确保已经安装了Bootstrap框架,因为它是该插件的基础。你可以通过...

    BootstrapPlugin - toggleButton 使用笔记

    BootstrapPlugin的toggleButton是一个在Web开发中非常实用的组件,尤其在构建响应式界面时。这个组件基于流行的Bootstrap框架,提供了美观且易于使用的开关按钮,用于替代传统的复选框或单选按钮。在本文中,我们将...

    BootstrapPlugin - notify 使用笔记

    BootstrapPlugin的notify功能是Bootstrap框架中的一个通知插件,它允许开发者轻松地在网页上创建各种类型的通知消息,提供了一种高效、灵活的方式来传递信息给用户。这个插件基于Bootstrap的CSS样式和JavaScript功能...

    2022年-软考-网络工程师-复习笔记

    2022年-软考-网络工程师-复习笔记-网络安全-上半年-学习笔记-考点-真题讲解-重点归纳

    2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法

    2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-...

    TypeScript Quickly-2020-英文版 学习笔记

    TypeScript Quickly-2020-英文版 学习笔记 TypeScript Quickly-2020-英文版 学习笔记 TypeScript Quickly-2020-英文版 学习笔记 TypeScript Quickly-2020-英文版 学习笔记 TypeScript Quickly-2020-英文版 学习笔记 ...

    Hadoop权威指南----读书笔记.pdf

    Hadoop权威指南----读书笔记

    Software Engineering at Google-2020-英文版 学习笔记

    Software Engineering at Google-2020-英文版 学习笔记 Software Engineering at Google-2020-英文版 学习笔记 Software Engineering at Google-2020-英文版 学习笔记 Software Engineering at Google-2020-英文版 ...

    学习笔记HTML-css-JS.zip

    学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip 学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip 学习笔记HTML-css-JS.zip学习笔记HTML-css-JS.zip学习笔记...

    Architecture Patterns with Python-2020-英文版 笔记

    《Architecture Patterns with Python-2020》-英文版 笔记 Harry Percival and Bob Gregory 《Architecture Patterns with Python-2020》-英文版 笔记 Harry Percival and Bob Gregory 《Architecture Patterns with...

    Oracle-11g-OCP-051培训笔记

    Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-基于ssm的云的学习笔记系统-ssm-java代码

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...

Global site tag (gtag.js) - Google Analytics