java日期工具类、日期格式校验、日期格式化_java校验日期格式-程序员宅基地

技术标签: 日期格式校验  java  java日期工具类  日期格式化  

前言

java项目中经常会使用到对日期进行格式校验、格式化日期、LocalDate与Date互转等等,以下整理一份经常会使用到的日期操作相关的方法。

日期格式校验

一般项目中需要对入参进行校验,比如必须是一个合法的日期且格式为yyyy-MM-dd,则可使用以下方法对日期进行校验

public static void main(String[] args) {
    
	String date = "2018-02- 9";
	// 调用isLegalDate方法的时候,length参数一定要是要校验日期的length
	System.out.println(isLegalDate(date,date.length(),"yyyy-MM-dd")); //false
	//如下面的示例,若length传入的是date的长度,则以下这种日期格式也能用isLegalDate方法进行校验
	date = "2018年02月09日";
	System.out.println(isLegalDate(date,date.length(),"yyyy'年'MM'月'dd'日'"));//true
}

/**
 * 校验日期是否是符合指定格式的合法日期
 * <p>
 *    此方法是为了解决接口入参的日期格式校验,我们需要接口入参是日期是一个合法的而且是指定格式的日期
 * </p>
 *
 * @param date 日期
 * @param length 日期的长度,必须是date参数的长度,这样可以兼容多种格式的校验
 * @param format 日期的格式,需要与日期格式保持一致
 * @return
 */
public static boolean isLegalDate(String date,int length,String format){
    
	if(date == null || date.length() != length){
    
		return false;
	}
	try{
    
		DateFormat formatter = new SimpleDateFormat(format);
		// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2018-02-29会被接受,并转换成2018-03-01
		//"2019022 "|"201902 2" 这两种也能被Date转化,所以最后需要用date.equals(formatter.format(date1));
		formatter.setLenient(false);
		Date date1 = formatter.parse(date);
		log.info("入参:"+date+";转换后日期:"+formatter.format(date1));
		return date.equals(formatter.format(date1));
	}catch (Exception e){
    
		log.info(e.getMessage(),e);
		return false;
	}
}

String转Date

将String类型的日期转化为Date类型

public static void main(String[] args) {
    
	String date = "2018-02-09";
	System.out.println(parse(date,"yyyy-MM-dd")); //Fri Feb 09 00:00:00 CST 2018
}

/**
* 使用用户格式格式化日期
 *
 * @param date 日期
 * @param pattern 日期格式,格式需要与入参格式保持一致
 * @return
 */
public static Date parse(String date, String pattern) {
    
	Date returnValue = null;
	if (date != null) {
    
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		try {
    
			returnValue = df.parse(date);
		} catch (ParseException e) {
    
//				throw new BusinessException(ResponseEnum.DATE_PARSE_FAILURE);
		}
	}
	return returnValue;
}

Date格式化为String类型

将Date类型的日期格式化为String类型,如将Date输出为yyyyMMdd、yyyy-MM-dd、yyyy-MM格式等等

public static void main(String[] args) {
    
	Date date = parse("2022-02-05", "yyyy-MM-dd");
	System.out.println(format(date, "yyyy-MM-dd")); //2022-02-05
	System.out.println(format(date, "yyyyMMdd")); //20220205
	System.out.println(format(date, "yyyy-MM")); //2022-02
}

/**
 * 使用用户格式格式化日期
 *
 * @param date 日期
 * @param pattern 日期格式
 * @return
 */
public static String format(Date date, String pattern) {
    
	String returnValue = "";
	if (date != null) {
    
		SimpleDateFormat df = new SimpleDateFormat(pattern);

		returnValue = df.format(date);
	}
	return (returnValue);
}

获取指定日期所在季度的第一天

如获取2022-02-02所在季度的第一天

/**
* 获取入参所在季度的第一天
 * @param date
 * @return
 */
public static Date getQuarterStart(Date date){
    
	Calendar startCalendar = Calendar.getInstance();
	startCalendar.setTime(date);
	//get方法:获取给定日历属性的值,如 endCalendar.get(Calendar.MONTH) 获取日历的月份
	//计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第一个月份只需 月份 / 3 * 3
	startCalendar.set(Calendar.MONTH, ((startCalendar.get(Calendar.MONTH)) / 3) * 3);
	startCalendar.set(Calendar.DAY_OF_MONTH, 1);
	return startCalendar.getTime();
}

获取指定日期所在季度的最后一天

如获取2022-02-02所在季度的最后一天

/**
 * 获取入参所在季度的最后一天
 * @param date
 * @return
 */
public static Date getQuarterEnd(Date date) {
     // 季度结束
	Calendar endCalendar = Calendar.getInstance();
	endCalendar.setTime(date);
	//计算季度数:由于月份从0开始,即1月份的Calendar.MONTH值为0,所以计算季度的第三个月份只需 月份 / 3 * 3 + 2
	endCalendar.set(Calendar.MONTH, ((endCalendar.get(Calendar.MONTH)) / 3) * 3 + 2);
	endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
	return endCalendar.getTime();
}

LocalDate转Date

/**
 * LocalDate转为Date 格式
 * @param localDate
 * @return
 */
public static Date localDateToDate(LocalDate localDate){
    
	ZoneId zone = ZoneId.systemDefault();
	Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
	return Date.from(instant);
}

日期utils工具类

import lombok.extern.slf4j.Slf4j;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;


@Slf4j
public class DateUtil {
    

	public static void main(String[] args) {
    
		String date = "2018-02- 9";
		System.out.println(isLegalDate(date,date.length(),"yyyy-MM-dd"));
	}

	/**
	 * 校验日期是否是符合指定格式的合法日期
	 * <p>
	 *    此方法是为了解决接口入参的日期格式校验,我们需要接口入参是日期是一个合法的而且是指定格式的日期
	 * </p>
	 *
	 * @param date 日期
	 * @param length 日期的长度
	 * @param format 日期的格式,需要与日期格式保持一致
	 * @return
	 */
	public static boolean isLegalDate(String date,int length,String format){
    
		if(date == null || date.length() != length){
    
			return false;
		}
		try{
    
			DateFormat formatter = new SimpleDateFormat(format);
			// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2018-02-29会被接受,并转换成2018-03-01
			//"2019022 "|"201902 2" 这两种也能被Date转化,所以最后需要用date.equals(formatter.format(date1));
			formatter.setLenient(false);
			Date date1 = formatter.parse(date);
			log.info("入参:"+date+";转换后日期:"+formatter.format(date1));
			return date.equals(formatter.format(date1));
		}catch (Exception e){
    
			log.info(e.getMessage(),e);
			return false;
		}
	}

	/**
	 * 	将LocalDateTime转换成Date
	 *
	 * 	@param localDateTime
	 * 	@return
	 */
	public static Date localDateTimeToDate (LocalDateTime localDateTime) {
    
		if (null == localDateTime) {
    
			return null;
		}
		try {
    
			return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
		} catch (Exception e) {
    
			log.warn("将LocalDateTime转换成Date发生异常 : " + e.getMessage(), e);
			return null;
		}
	}

	/**
	 * 	将Date转换成LocalDateTime
	 *
	 * 	@param date
	 * 	@return
	 */
	public static LocalDateTime dateToLocalDateTime (Date date) {
    
		if (null == date) {
    
			return null;
		}
		try {
    
			Instant instant = date.toInstant();
			ZoneId zoneId = ZoneId.systemDefault();
			return  instant.atZone(zoneId).toLocalDateTime();
		} catch (Exception e) {
    
			log.warn("将Date转换成LocalDateTime发生异常 : " + e.getMessage(), e);
			return null;
		}
	}


	/**
	 * 	获取当日最小时间(0时0分0秒)
	 * 	@return
	 */
	public static LocalDateTime getCurrentDayStart () {
    
		return LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
	}

	/**
	 * 	获取当日最大时间(23时59分59秒)
	 * 	@return
	 */
	public static LocalDateTime getCurrentDayEnd () {
    
		return LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
	}

	/**
	 * 获取昨天的年月日 yyyy-MM-dd
	 * @return
	 */
	public static String getStringYesterday(){
    
		LocalDate date = LocalDate.now().plusDays(-1);
		return date.toString();
	}

	/**
	 * 获取入参日期的前一天 yyyyMMdd
	 * @param date 日期 yyyy-MM-dd/yyyyMMdd
	 * @param pattern 必须与data参数格式保持一致,若入参data是八位,则pattern为yyyyMMdd
	 * @return yyyyMMdd
	 */
	public static Integer getBeforeOfDate(String date,String pattern){
    
		LocalDate localDate = LocalDate.parse(date,DateTimeFormatter.ofPattern(pattern)).plusDays(-1); //直接调用parse的话,入参必须是10位的日期即yyyy-MM-dd,若位数缺少,会抛异常
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
		return Integer.parseInt(localDate.format(dtf));
	}

	/**
	 * 获取当前自然日期的年月日 yyyyMMdd
	 * @return
	 */
	public static Integer getTodayLocalDate(){
    
		LocalDate localDate = LocalDate.now();
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
		return Integer.parseInt(localDate.format(dtf));
	}

	/**
	 * 获取参数日期的当月一号0点
	 * @param date
	 * @return
	 */
	public static Date getMonthStart(Date date){
    
		LocalDateTime localDateTime = dateToLocalDateTime(date);
		localDateTime = localDateTime.with(TemporalAdjusters.firstDayOfMonth());
		localDateTime = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MIN);
		return localDateTimeToDate(localDateTime);
	}

	/**
	 * 获取参数日期的当月最后一天23点
	 * @param date
	 * @return
	 */
	public static Date getMonthLast(Date date){
    
		LocalDateTime localDateTime = dateToLocalDateTime(date);
		localDateTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
		localDateTime = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX);
		return localDateTimeToDate(localDateTime);
	}

	/**
	 * 获取参数日期的上月一号0点
	 * @param date
	 * @return
	 */
	public static Date getLastMonthStart(Date date){
    
		LocalDateTime localDateTime = dateToLocalDateTime(date);
		localDateTime = localDateTime.plusMonths(-1);
		localDateTime = localDateTime.with(TemporalAdjusters.firstDayOfMonth());
		localDateTime = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MIN);
		return localDateTimeToDate(localDateTime);
	}
	/**
	 * 获取参数日期的上月末尾时间
	 * @param date
	 * @return
	 */
	public static Date getLastMonthEnd(Date date){
    
		LocalDateTime localDateTime = dateToLocalDateTime(date);
		localDateTime = localDateTime.plusMonths(-1);
		localDateTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
		localDateTime = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX);
		return localDateTimeToDate(localDateTime);
	}


	/**
	 * 获取参数日期的上周一0点
	 * @param date
	 * @return
	 */
	public static Date getLastWeekStart(Date date){
    
		LocalDateTime localDateTime = dateToLocalDateTime(date);
		localDateTime = localDateTime.plusWeeks(-1);
		localDateTime = localDateTime.with(DayOfWeek.MONDAY);
		localDateTime = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MIN);
		return localDateTimeToDate(localDateTime);
	}
	/**
	 * 获取参数日期的上周日23:59:59点
	 * @param date
	 * @return
	 */
	public static Date getLastWeekEnd(Date date){
    
		LocalDateTime localDateTime = dateToLocalDateTime(date);
		localDateTime = localDateTime.plusWeeks(-1);
		localDateTime = localDateTime.with(DayOfWeek.SUNDAY);
		localDateTime = LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX);
		return localDateTimeToDate(localDateTime);
	}

	/**
	 * 获取当前日期的前一天
	 * @param date
	 *
	 */
	public static Date getYesterday(Date date){
    
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DATE,-1);
		return calendar.getTime();
	}


	/**
	 * 获取一天的开始时间
	 * @param date
	 * @return
	 */
	public static Date getStart(Date date){
    
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY,0);
		calendar.set(Calendar.MINUTE,0);
		calendar.set(Calendar.SECOND,0);
		calendar.set(Calendar.MILLISECOND,0);
		return calendar.getTime();
	}

	/**
	 * 获取一天的开始时间
	 * @param date
	 * @return
	 */
	public static Date getEnd(Date date){
    
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY,23);
		calendar.set(Calendar.MINUTE,59);
		calendar.set(Calendar.SECOND,59);
		calendar.set(Calendar.MILLISECOND,999);
		return calendar.getTime();
	}

	/**
	 * 使用用户格式格式化日期
	 *
	 * @param date 日期
	 * @param pattern 日期格式
	 * @return
	 */
	public static String format(Date date, String pattern) {
    
		String returnValue = "";
		if (date != null) {
    
			SimpleDateFormat df = new SimpleDateFormat(pattern);

			returnValue = df.format(date);
		}
		return (returnValue);
	}
	/**
	 * 使用用户格式格式化日期
	 *
	 * @param date 日期
	 * @param pattern 日期格式
	 * @return
	 */
	public static String formatCn(Date date, String pattern) {
    
		String returnValue = "";
		if (date != null) {
    
			SimpleDateFormat df = new SimpleDateFormat(pattern, Locale.CHINA);

			returnValue = df.format(date);
		}
		return (returnValue);
	}
	/**
	 * 使用用户格式格式化日期
	 *
	 * @param date 日期
	 * @param pattern 日期格式,格式需要与入参格式保持一致
	 * @return
	 */
	public static Date parse(String date, String pattern) {
    
		Date returnValue = null;
		if (date != null) {
    
			SimpleDateFormat df = new SimpleDateFormat(pattern);
			try {
    
				returnValue = df.parse(date);
			} catch (ParseException e) {
    
				throw new BusinessException(ResponseEnum.DATE_PARSE_FAILURE);
			}
		}
		return returnValue;
	}

	/**
	 * @Method getDateTimeOfTimestamp
	 * @Description 根据时间戳获取时间
	 */
	public static LocalDateTime getDateTimeOfTimestamp (long timestamp) {
    
		Instant instant = Instant.ofEpochMilli(timestamp);
		ZoneId zone = ZoneId.systemDefault();
		return LocalDateTime.ofInstant(instant, zone);
	}


	/**
	 * 使用用户格式格式化LocalDateTime
	 *
	 * @param date 日期
	 * @param pattern 日期格式
	 * @return
	 */
	public static LocalDateTime formatLocalDT(String date, String pattern) {
    
		DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern(pattern);
		return LocalDateTime.parse(date, timeDtf);
	}


}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49114503/article/details/125747049

智能推荐

射频MOS管和三极管优缺点对比_mos管比起三极管有什么优势-程序员宅基地

文章浏览阅读5.1k次。MOS管优点:1.具有良好的温度特性。2.具有良好的噪声特性。3.输入阻抗高。4.MOS管的漏极电流具有二次函数特性,三极管的集电极电流是指数形式。5.MOS管的上限频率远远超过三极管的上限工作频率。6.MOS管功耗较小。MOS管缺点:1.增益通常较低。2.输入阻抗高,导致匹配网络难设计。3.相对于三极管,MOS管的功率容量偏低..._mos管比起三极管有什么优势

华为云云耀云服务器L实例评测使用_华为云耀云服务器l实例跟腾讯云什么服务器类似-程序员宅基地

文章浏览阅读172次。其次就是会发送一条开通后的短信到手机上,这点还可以吧,不过也没太大必要,感觉要是第一次进这个服务器管理界面的话,有个服务器信息弹窗选择是新手还是老手,新手提示教程,老手提示服务器基础信息会更好一点,一般人买服务器都是在电脑上,感觉手机短信的不那么有必要。以下是进入后的界面,感觉还行吧,就是都是统一的黑色,没感觉到重点,熟悉后,应该会好一些,但是什么重置密码,设置网关什么的不好找到,需要详细的找一下,这点不太好。还有一次创建失败的信息,也不知道因为什么,在后边价格联系客服之类的应该会更好一点。_华为云耀云服务器l实例跟腾讯云什么服务器类似

在安装win7系统时如何不产生100M的系统保留分区_做系统的保留分区只有50mb-程序员宅基地

文章浏览阅读855次。在安装win7系统时如何不产生100M的系统保留分区 如果你是从xp系统升级安装,或者重新安装win7系统,应该不会出现所谓的100M系统保留分区情况。 这里说的安装指的的对新的磁盘或者删除了老的所有分区后的安装win7系统。 第一种方法:利用第三方分区工具先对磁盘进行分区。没有第三方工具,利用xp安装盘,进行磁盘分区也行。只要分区格式化就可以了,没有必要安装xp系统_做系统的保留分区只有50mb

大厂程序员都爱用的六款IDE工具,你都知道吗?_ide软件-程序员宅基地

文章浏览阅读2k次。给大家推荐六款好用的IDE工具,快来看看吧!_ide软件

若依项目框架解析_若依框架-程序员宅基地

文章浏览阅读6.7k次。若依_若依框架

ElementUI 自定义表头 el-table_elementui 表头自定义-程序员宅基地

文章浏览阅读1.6k次。ElementUI 自定义表头 el-table昨晚睡不着的时候,突然想到了前段时间做的一个需求,但是只记得大概了,所以早起复习一下在ElementUI 中,都知道 el-table 定义表格,但是很多时候,官方的并满足不了需求,这时候就需要用到官方提供的自定义表头首先,我们需要在 el-table-column 里面添加 render-header 属性<el-table-column v-for="(item, index) in columnList" :key="index" :_elementui 表头自定义

随便推点

显卡驱动 1080Ti Linux,Ubuntu18.04 Nvidia1080ti环境安装显卡驱动-程序员宅基地

文章浏览阅读483次。安装了1080ti显卡的电脑安装Ubuntu16.04和17.04都有烦人的黑屏问题,应该是内置显卡驱动不稳定导致的问题。安装刚新出的Ubuntu18.04尝试一下,很好很顺畅,没什么问题,系统直接安装成功,接着安装官方的显卡驱动。1、重启进入BIOS,将secure boot取消(设为disabled),再重启2、用命令lsmod | grep nouveau如果有东西输出,就要去关闭自带的No..._ubuntu18.04 1080ti 驱动

Nginx详解 五:反向代理-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏55次。正向代理代理的是客户端正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端反向代理代理的是服务端反向代理:(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 IP 地址。_反向代理

IE浏览器进行跳转时卡死/调用打印控件时卡死解决_ie浏览器打印文书时跳转过去就卡住怎么-程序员宅基地

文章浏览阅读197次。【代码】IE浏览器进行跳转时卡死/调用打印控件时卡死解决。_ie浏览器打印文书时跳转过去就卡住怎么

ADB的push和pull示例_adb pull 例子-程序员宅基地

文章浏览阅读1.6k次。简述**环境:**window10 cmd窗口adb push 电脑路径 手机路径adb pull 手机路径 电脑路径一、向手机推送应用文件并刷新adb rootadb remountadb push Z:\SDK\media_android9_rk3399\out\target\product\rk3399\system\priv-app\Settings /system/priv-appadb shell ps |findstr settingadb shell kill xxx二、_adb pull 例子

mysql group by 与order by 一起使用_mysql group by和order by一起用-程序员宅基地

文章浏览阅读898次。我需要把数据分组排序,于是就想到先group by 然后 order by,可是运行的时候报错于是查资料发现group by 与order by 一起使用是要遵守一定原则的:order by 的列,必须是出现在group by 子句里的列也可以用来查询一条语句(注意数据库版本)select * from (select distinct * from op_order_c..._mysql group by和order by一起用

Win10 1803 UEFI安装Linux Mint Cindy-程序员宅基地

文章浏览阅读1k次。为什么选择Linux Mint配置:游戏本,双显卡,与Linux的兼容不大好,Linux Mint提供了合适的驱动,安装完就可以正常使用。一些联想的品牌对Ubuntu的兼容性就比较好,可以去Ubuntu官网去查。安装Linux一些问题没有以dd方式刻录iso,一些比较新的镜像在开机时文件系统无法被识别,如kali-linux-2018.3安装完系统无法正常生成bootx64.efi,导致..._uefi安装linux mint

推荐文章

热门文章

相关标签