后台接收前台传来的日期类型,@DateTimeFormat注解简单使用,认识注解InitBinde,对要转换的字符串类型进行处理,
源码获取github
1.项目结构
2.@DateTimeFormat注解简单使用
demo01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>传递日期的字符串</h2>
<form action="client01" method="get">
<input type="text" name="mydate">
<button>日期字符串</button>
</form>
</body>
</html>
DateDemoController.java
/**
* 接收日期类型的客户端传递数据,简写方式
* 没有写注解,就写 2018/8/14 15:31:20
* 写了注解就按照他的格式来,如果没有写时间,你输入了时间也不会认
* 如果一个类中也有这样的属性,同时接收这个时间,注解里也要写格式
*
* @return
*/
@GetMapping("/client01")
public ModelAndView test01(
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date mydate,
User user) {
System.out.println(mydate);
System.out.println(user);
return null;
}
User.java
package com.hs.model;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class User {
//注解放哪,根据公司要求
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
Date mydate;
public Date getMydate() {
return mydate;
}
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public void setMydate(Date mydate) {
this.mydate = mydate;
}
@Override
public String toString() {
return "User{" +
"mydate=" + mydate +
'}';
}
}
3.认识注解InitBinde
InitBinderDemoController.java
package com.hs.web;
import com.hs.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* 认识注解InitBinder
*/
@Controller
public class InitBinderDemoController {
@GetMapping("/test01")
public ModelAndView test01() {
System.out.println("test01");
return null;
}
@GetMapping("/test02")
public ModelAndView test02(HttpServletRequest request, HttpServletResponse response) {
System.out.println("test02");
return null;
}
@GetMapping("/test03")
public ModelAndView test03(Map<String, Object> map) {
System.out.println("test03");
return null;
}
@GetMapping("/test04")
public ModelAndView test04(Integer user_id) {
System.out.println("test04");
return null;
}
@GetMapping("/test05")
public ModelAndView test05(String name, Integer user_id) {
System.out.println("test05");
return null;
}
@GetMapping("/test06")
public ModelAndView test06(User user) {
System.out.println("test06");
return null;
}
@GetMapping("/test07")
public ModelAndView test07(User user, String name) {
System.out.println("test07");
return null;
}
@InitBinder
public void init01() {
System.out.println("需要知道什么情况下执行?");
}
}
运行之后发现,04,06都是调用了1次,05,07调用了两次,因为这些的形参,被传递过来,都要进行转换,所以就调用了@InitBinder注解:当传递过来的数据要进行转换的时候才调用。
4.对要转换的字符串类型进行处理
StringDemoController.java
package com.hs.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.ModelAndView;
import java.beans.PropertyEditorSupport;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 对要转换的字符串类型进行处理
*/
@Controller
public class StringDemoController {
@GetMapping("hs01")
public ModelAndView test01(Integer user_id) {
System.out.println(user_id);
return null;
}
@GetMapping("hs02")
public ModelAndView test02(String user_name) {
System.out.println(user_name);
return null;
}
@GetMapping("hs03")
public ModelAndView test03(String user_name, Integer user_id) {
System.out.println(user_name);
System.out.println(user_id);
return null;
}
/**
* 时间格式的转换
*
* @param date1
* @return
*/
@GetMapping("hs04")
public ModelAndView test04(Date date1) {
System.out.println("日期为" + date1);
return null;
}
@InitBinder
public void init01(WebDataBinder binder) {
//监控要转换(String)的数据类型
binder.registerCustomEditor(String.class, /*匿名对象*/new PropertyEditorSupport() {
//重写了setAsText方法
@Override
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("之前接收的值----" + text);
//对数据重新处理赋值,赋值给形参user_name
this.setValue("对数据处理之后的值----" + text + "悟空");
}
});
//监控Integer类型
binder.registerCustomEditor(Integer.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
System.out.println(text);
this.setValue("999");
}
});
}
@InitBinder
public void init02(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = df.parse(text);
this.setValue(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
});
}
}
5.用别人封装好的工具类实现各种日期类型都可以转换
需要commons-lang3-3.4.jar这个包
DateHelper.java
package com.hs.util;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
/**
* 扩展DateUtils的基础上扩展属于自己的工具类
*造轮子
* @author 刘文铭
* @see com.shxt.commons.helper.DateHelper
* @since 1.0
*/
public final class DateHelper extends DateUtils {
private final static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
"yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd",
"yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
private final static String DEFAULT_DATE_TIME = "yyyy-MM-dd HH:mm:dd";
private final static String DEFAULT_DATE = "yyyy-MM-dd";
private final static String DEFAULT_TIME = "HH:mm:dd";
private final static String DEFAULT_YEAR = "yyyy";
private final static String DEFAULT_MONTH = "MM";
private final static String DEFAULT_DAY = "dd";
private final static String DEFAULT_E = "E";
private static Date nowDate = new Date();
private static Calendar calendar = Calendar.getInstance();
/**
* java.util.Date转换格式(yyyy-MM-dd)
*
* @return String
*/
public static String getCurrentDate() {
return DateHelper.getDefDateTime(DEFAULT_DATE);
}
/**
* java.util.Date转换格式(HH:mm:ss)
*
* @return String
*/
public static String getCurrentTime() {
return DateHelper.getDefDateTime(DEFAULT_TIME);
}
/**
* java.util.Date转换格式(yyyy-MM-dd HH:mm:ss)
*
* @return String
*/
public static String getCurrentDateTime() {
return DateHelper.getDefDateTime(DEFAULT_DATE_TIME);
}
/**
* 获取自定义格式的当前日期
* <p>
* 获取特定格式的日期
* </p>
*
* @param pattern 默认格式(yyyy-MM-dd) 可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
* @return String
*/
public static String getDefDateTime(String pattern) {
return DateFormatUtils.format(nowDate, pattern);
}
/**
* 得到当前年份字符串 格式(yyyy)
*
* @return String
*/
public static String getYear() {
return DateHelper.getDefDateTime(DEFAULT_YEAR);
}
/**
* 得到当前月份字符串 格式(MM)
*
* @return String
*/
public static String getMonth() {
return DateHelper.getDefDateTime(DEFAULT_MONTH);
}
/**
* 得到当天字符串 格式(dd)
*
* @return String
*/
public static String getDay() {
return DateHelper.getDefDateTime(DEFAULT_DAY);
}
/**
* 得到当前星期字符串 格式(E)星期几
*
* @return String
*/
public static String getWeek() {
return DateHelper.getDefDateTime(DEFAULT_E);
}
/**
* 获取日期字符串,java.util.Date转化为字符串
* <p>
* 使用格式化数据,
* </p>
*
* @param date
* @param pattern 默认格式(yyyy-MM-dd) 可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
* @return String
*/
public static String formatDate(Date date, String... pattern) {
String formatDate = null;
if (pattern != null && pattern.length > 0) {
formatDate = DateFormatUtils.format(date, pattern[0].toString().trim());
} else {
formatDate = DateFormatUtils.format(date, DEFAULT_DATE);
}
return formatDate;
}
/**
* 日期型字符串转化为日期 格式
* { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
* "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
* "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
*/
public static Date parseDate(Object date_str) {
try {
if (date_str == null || String.valueOf(date_str).trim().length() == 0) {
return null;
}
return DateUtils.parseDate(String.valueOf(date_str).trim(), parsePatterns);
} catch (ParseException pe) {
System.out.println("DateHelper-->parseDate方法格式化错误");
return null;
}
}
/**
* 获取过去的天数
*
* @param date
* @return
*/
public static long pastDays(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (24 * 60 * 60 * 1000);
}
/**
* 获取过去的小时
*
* @param date
* @return
*/
public static long pastHour(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (60 * 60 * 1000);
}
/**
* 获取过去的分钟
*
* @param date
* @return
*/
public static long pastMinutes(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (60 * 1000);
}
/**
* 转换为时间(天,时:分:秒.毫秒)
*
* @param timeMillis
* @return
*/
public static String formatDateTime(long timeMillis) {
long day = timeMillis / (24 * 60 * 60 * 1000);
long hour = timeMillis / (60 * 60 * 1000) - day * 24;
long min = timeMillis / (60 * 1000) - day * 24 * 60 - hour * 60;
long s = timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60;
long sss = timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000;
return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
}
/**
* 获取两个日期之间的天数
*
* @param before
* @param after
* @return
*/
public static double getDistanceOfTwoDate(Date before, Date after) {
long beforeTime = before.getTime();
long afterTime = after.getTime();
return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
}
/**
* 获取当前日期,一周前的日期字符串
*
* @return String
*/
public static String getLastWeek() {
long rightnow = calendar.getTimeInMillis();
long aweekbefore = 6 * 24 * 60 * 60 * 1000;
return DateFormatUtils.format(rightnow - aweekbefore, DEFAULT_DATE);
}
/**
* 获取格式化当前月第一天的表达式
*
* @return String
*/
public static String getFirstDayInMonth() {
calendar.set(DateHelper.getYearNUM(), DateHelper.getMonthNUM() - 1, 1);// 设为当前月的1号 ,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
}
/**
* 获取格式化给定月(参数:逻辑月)第一天的表达式,重载方法
*
* @param month
* @return String
*/
public static String getFirstDayInMonth(int month) {
calendar.set(DateHelper.getYearNUM(), month - 1, 1);// 设为当前月的1号 ,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
}
/**
* 获取格式化给定月(参数:逻辑月)最后一天的表达式
*
* @param month
* @return String
*/
public static String getLastDayInMonth(int month) {
calendar.set(DateHelper.getYearNUM(), month, 1); // 设成下个月的一号,往前减一天的时间
return DateFormatUtils.format(calendar.getTimeInMillis() - 24 * 60 * 60 * 1000, DEFAULT_DATE);
}
/**
* 获取格式化当前季度第一天的表达式
*
* @return String
*/
public static String getFirstDayInQuart() {
int month = DateHelper.getMonthNUM();
if (month >= 1 && month <= 3) {
month = 1;
}
if (month >= 4 && month <= 6) {
month = 4;
}
if (month >= 7 && month <= 9) {
month = 7;
}
if (month >= 10 && month <= 12) {
month = 10;
}
calendar.set(DateHelper.getYearNUM(), month - 1, 1); // 当年当季一号,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
}
/**
* @return String 获取格式化一年第一天的表达式
*/
public static String getFirstDayInYear() { /** 获取格式化一年第一天的表达式 **/
calendar.set(calendar.get(Calendar.YEAR), 0, 1); // 当年第一个月一号,月从0开始
return DateFormatUtils.format(calendar.getTime(), DEFAULT_DATE);
}
/**
* @return int 获得当前年份
*/
public static int getYearNUM() { /** 获得当前年份 */
return calendar.get(Calendar.YEAR);
}
/**
* @return int 获得当前月份
*/
public static int getMonthNUM() { /*** 获得当前月份 **/
return calendar.get(Calendar.MONTH) + 1;
}
/**
* @return int 获得当前周数
*/
public static int getWeekNUM() { /*** 获得当前周数 **/
return calendar.get(Calendar.DAY_OF_WEEK);
}
/**
* @return int 取到一天中的小时数
*/
public static int getHoursofDay() {
return Calendar.HOUR_OF_DAY;
}
/**
* 获取最近ndays天(含今天)的日期,返回日期表达式数组
*
* @param ndays
* @return String[]
*/
public static String[] getDaysBackward(int ndays) {
String[] daysBackward = new String[ndays];
Calendar lastDate;
for (int i = 0; i < ndays; i++) {
lastDate = Calendar.getInstance();
lastDate.add(Calendar.DATE, -1 * i); // 减去一天,变为上月最后一天
daysBackward[ndays - 1 - i] = DateFormatUtils.format(lastDate.getTimeInMillis(), DEFAULT_DATE);
}
return daysBackward;
}
}
DateDemoController.java
/**
* 用别人封装好的时间类型转换类,造轮子
*
* @param mydate
* @return
*/
@GetMapping("/client01")
public ModelAndView test01(Date mydate) {
System.out.println(mydate);
return null;
}
@InitBinder
public void initDate(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new PropertyEditorSupport(){
@Override
public void setAsText(String text) throws IllegalArgumentException {
this.setValue(DateHelper.parseDate(text));
}
});
}
页面还是那个demo01.jsp页面