提升开发效率(JAVA特别篇)
一、时间格式化
DateTime dateTime = DateUtil.offsetMonth(new Date(), 1);
String yyyMMdd = DateUtil.format(dateTime, "yyyyM月");
System.out.println(yyyMMdd);
打印:20234月
二、Mybatis自定义sql的同时还不放弃Wrapper
1.Service层正常书写wrapper
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.eq(true, User::getUserName, "admin");
User one = userMapper.getDate(wrapper);
System.err.println(one);
2.Mapper(DAO)层直接使用注解
+Constants
(多表查询的时候VO不用写Where了)
@Select("select * from SHOP_DATA.USER ${ew.customSqlSegment}")
User getDate(@Param(Constants.WRAPPER) LambdaQueryWrapper<User> wrapper);
@Param(Constants.WRAPPER) Wrapper wrapper 和 querySql 里面的 ${ew.customSqlSegment} 是Wrapper 自定义SQL,让我们可以自定义SQL的同时也能使用Wrapper的便利!!!
三、Hutool的时间工具类
1.概述
日期时间包是Hutool的核心包之一,提供针对JDK中Date和Calendar对象的封装,其中DateUtil中有针对日期时间操作提供一系列静态方法。
2.常用方法
1)Date、long、Calendar之间的相互转换
public static void main(String[] args) {
//当前时间:date = 2019-09-17 16:59:23
Date date = DateUtil.date();
//当前时间:date2 = 2019-09-17 16:59:23
Date date2 = DateUtil.date(Calendar.getInstance());
//当前时间:date3 = 2019-09-17 16:59:23
Date date3 = DateUtil.date(System.currentTimeMillis());
//当前时间字符串:now = 2019-09-17 16:59:23
String now = DateUtil.now();
//当前日期字符串:today = 2019-09-17
String today= DateUtil.today();
}
2)字符串转日期
/*DateUtil.parse方法会自动识别一些常用格式,包括:
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd
HH:mm:ss
yyyy-MM-dd HH:mm
yyyy-MM-dd HH:mm:ss.SSS*/
//这四种情况均可以转换,并且输出结果均为: 2019-09-17 00:00:00
Date date1 = DateUtil.parse("2019-09-17");
Date date2 = DateUtil.parse("2019-09-17", "yyyy-MM-dd");
Date date3 = DateUtil.parse("2019/09/17", "yyyy/MM/dd");
Date date4 = DateUtil.parse("2019:09:17", "yyyy:MM:dd");
3)格式化日期输出
Date date1 = DateUtil.parse("2019-09-17");
//结果: 2019/09/17
String format = DateUtil.format(date1, "yyyy/MM/dd");
//常用格式的格式化,结果:2017-03-01
String formatDate = DateUtil.formatDate(date1);
//结果:2019-09-17 00:00:00
String formatDateTime = DateUtil.formatDateTime(date1);
//结果:00:00:00
String formatTime = DateUtil.formatTime(date1);
4)获取Date对象的某个部分
Date date = DateUtil.date();
//获得年的部分:year = 2019
int year = DateUtil.year(date);
//获得月份,从0开始计数:month = 8
int month = DateUtil.month(date);
//获得月份枚举 :monthEnum = SEPTEMBER
Month monthEnum = DateUtil.monthEnum(date);
5)开始和结束时间
String now = DateUtil.now();
Date date = DateUtil.parse(now);
//一天的开始,结果:2019-09-17 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);
//一天的结束,结果:2019-09-17 23:59:59
Date endOfDay = DateUtil.endOfDay(date);
//一个月的开始
Date beginDate = DateUtil.beginOfMonth(date);
//一个月的结束
Date endDate = DateUtil.endOfMonth(date);
6)日期时间偏移
String now = DateUtil.now();
//date = 2019-09-17 17:35:35
Date date = DateUtil.parse(now);
//结果:newDate = 2019-09-19 17:35:35
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);
//常用偏移,结果:newDate2 = 2019-09-20 17:35:35
DateTime newDate2 = DateUtil.offsetDay(date, 3);
//常用偏移,结果:newDate3 = 2019-09-17 14:35:35
DateTime newDate3 = DateUtil.offsetHour(date, -3);
//针对当前时间,提供了简化的偏移方法(例如昨天、上周、上个月等):
//昨天
DateUtil.yesterday()
//明天
DateUtil.tomorrow()
//上周
DateUtil.lastWeek()
//下周
DateUtil.nextWeek()
//上个月
DateUtil.lastMonth()
//下个月
DateUtil.nextMonth()
7)日期时间差
Date date1 = DateUtil.parse("2019-09-20 17:35:35");
Date date2 = DateUtil.parse("2019-09-17 14:35:35");
//这里若date1和date2换位置,输出结果不变:betweenDay = 3
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
8)其它
//年龄:ageOfNow = 28
int ageOfNow = DateUtil.ageOfNow("1991-01-13");
//是否闰年:leapYear = false
boolean leapYear = DateUtil.isLeapYear(2019);
四、数据库时间函数
1、查询当天的数据
select * from table_name where TO_DAYS(时间字段)=TO_DAYS(NOW());
2、查询当周的数据
select * from table_name where YEARWEEK(DATE_FORMAT(时间字段,'%Y-%m-%d'))=YEARWEEK(NOW());
3、查询当月的数据
select * from table_name where DATE_FORMAT(时间字段,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m');
4、查询昨天的数据
select * from table_name where TO_DAYS(NOW())-TO_DAYS(时间字段)=1;
5、查询最近7天的数据
select * from table_name where DATE_SUB(CURDATE(),INTERVAL 7 DAY)<=DATE(时间字段);
6、查询当年的数据
select * from table_name where YEAR(时间字段) =YEAR(NOW());
7、查询上周的数据
select * from table_name whereYEARWEEK(DATE_FORMAT(时间字段,'%Y-%m-%d'))=YEARWEEK(NOW())-1;
8、查询上月的数据
select *from table_name
where PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'),DATE_FORMAT(时间字段,'%Y%m');
9、查询本季度的数据
select * from table_name where QUARTER(时间字段)=QUARTER(now());
10、查询上季度的数据
select * from table_name where QUARTER(时间字段)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));
11、查询本年的数据
select * from table_name where YEAR(时间字段)=YEAR(NOW());
12、查询上年的数据
select * from table_name where year(时间字段)=year(date_sub(now(),interval 1 year));
13、按照天统计数据
SELECT
count(id) countNum,
DATE(时间字段) createTime
FROM
baj_checkimgs
GROUP BY
DATE(时间字段)
ORDER BY
DATE(时间字段) DESC;
14、按照周统计数据
SELECT
count(id) countNum,
WEEK(时间字段) createTime
FROM
baj_checkimgs
GROUP BY
WEEK(时间字段)
ORDER BY
WEEK(时间字段) DESC;
15、按月统计
SELECT
count(id) countNum,
MONTH(时间字段) createTime
FROM
baj_checkimgs
GROUP BY
MONTH(时间字段)
ORDER BY
MONTH(时间字段) DESC;
16、按照季度统计
SELECT
count(id) countNum,
QUARTER(时间字段) createTime
FROM
baj_checkimgs
GROUP BY
QUARTER(时间字段)
ORDER BY
QUARTER(时间字段) DESC;
17、按照年统计
SELECT
count(id) countNum,
YEAR(时间字段) createTime
FROM
baj_checkimgs
GROUP BY
YEAR(时间字段)
ORDER BY
YEAR(时间字段) DESC;