前言
最近项目中用到了一些关于日期类和字符串类的处理,用到一次就得去写一次,后来想了想这样不光效率低还浪费时间浪费精力,于是就将常用的一些方法提取成工具类,每个项目都考进去一次,用的时候直接调用即可。
下面我来分享一下我自己整理的一些工具方法:
代码展示
👉将时间戳转换成具体的年月日时分秒
在和安卓端交互时,处理时间的时候,一般都是以时间戳的方式进行互相传输,但是在PC端的时候,往往直接处理日期类型的数据比较方便,数据库中也是存的datetime
格式的数据,于是我就写了个将时间戳转换成具体的时间,代码如下:
/** * 将毫秒转换成时间 */ /** * 根据时间戳获取时间 */ public static String getTimeChuo(Long time) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //将时间戳转换为时间 Date date = new Date(time); return format.format(date); }
🤞输入:1657335494926
✌输出:2022-07-09 10:58:14
👉计算两个日期之间相差的天数
有时候我们有这样的场景,需要知道一下开始日期和结束日期之间相差多少天,多少小时,多少分等,于是我就写了个计算两个日期之间相差的详细时间,代码如下:
/** * @param stratTime * @param endTime * @return 计算两个日期之间相差的天数 */ public static Map<String, Object> dateDiff(Long stratTime, Long endTime) { Map<String, Object> map = new HashMap<>(); Long diff = endTime - stratTime; Long day = diff / (24 * 60 * 60 * 1000); Long hour = (diff / (60 * 60 * 1000) - day * 24); Long min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60); Long sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); map.put("day", day); map.put("hour", hour); map.put("min", min); map.put("sec", sec); return map; }
🤞输入:1656151439784L,1657335494926L
✌输出:{sec=15, min=54, hour=16, day=13},是一个Map
结合
👉获取当前24小时的时间前后时间戳
比如现在是:2022年7月9日11:14:22,有些业务场景下,我们需要获取当前时间的前后24的时间,也就是昨天的这个时间和明天的这个时间,于是我就写了个工具方法,代码如下:
/** * 获取当前24小时的时间前后时间戳 */ public static Map<String, Object> getTimeChuo() { Map<String, Object> map = new HashMap<>(); Long nowTime = System.currentTimeMillis(); Long startTime = nowTime - 24 * 60 * 60 * 1000; Long endTime = nowTime + 24 * 60 * 60 * 1000; map.put("startTime", startTime); map.put("endTime", endTime); return map; }
🤞输入:无需参数
✌输出:{startTime=1657250129070, endTime=1657422929070},转化成日期就是:2022年7月8日11:14:22和2022年7月10日11:14:22
👉根据出生日期获得年龄
系统中的年龄你能直接写死吗,倒也可以,但是你明年得手动的再给人家加1岁。。。后年再加一岁。。。。。这不是个完全之策,于是我就写了个根据出生日期计算年龄的工具方法,代码如下:
public static int getAge(Date birthDay) throws Exception { Calendar cal = Calendar.getInstance(); if (cal.before(birthDay)) { throw new IllegalArgumentException("出生日期小于当前时间,无效的日期!"); } int yearNow = cal.get(Calendar.YEAR); int monthNow = cal.get(Calendar.MONTH); int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); cal.setTime(birthDay); int yearBirth = cal.get(Calendar.YEAR); int monthBirth = cal.get(Calendar.MONTH); int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); int age = yearNow - yearBirth; if (monthNow <= monthBirth) { if (monthNow == monthBirth) { if (dayOfMonthNow < dayOfMonthBirth) age--; } else { age--; } } return age; }
🤞输入:new SimpleDateFormat("yyyy-MM-dd").parse("1998-09-08")
✌输出:23
👉统计两个日期之间的所有日期
比如有这样的场景,给某个人制定了个训练计划,这个计划从7月1日到7月7日,一周的减肥增肌方案。数据库存的话,只存了开始时间7月1日和结束时间7月7日。但是有个问题,你说这个人在7月5日有没有训练计划,7月6日有没有?当然有,于是我就写了个工具方法,代码如下:
/** * 统计两个日期之间的所有日期 */ public static List<String> getBeginTimeAndEndTime(Date beginTime, Date endTime) { List<String> listDate = new ArrayList<>(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Calendar calendar = Calendar.getInstance(); calendar.setTime(beginTime); while (calendar.getTime().before(endTime) || calendar.getTime().equals(endTime)) { listDate.add(dateFormat.format(calendar.getTime())); calendar.add(Calendar.DAY_OF_MONTH, 1); } return listDate; } catch (Exception e) { e.printStackTrace(); } return listDate; }
🤞输入:new SimpleDateFormat("yyyy-MM-dd").parse("2022-7-1"),new SimpleDateFormat("yyyy-MM-dd").parse("2022-7-8")
✌输出:
2022-07-01
2022-07-02
2022-07-03
2022-07-04
2022-07-05
2022-07-06
2022-07-07
2022-07-08
👉格式化日期:00:00点开始到23:59
将某个日期格式化成0时0分到23时59分,于是我就写了个工具方法,代码如下:
/** * 格式化日期:00:00点开始到23:59 */ public static List<Date> formatDayDateStratToEnd(String date){ List<Date> dateList = new ArrayList<Date>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calendar.getInstance(); try { c.setTime(simpleDateFormat.parse(date+" 00:00:00")); } catch (ParseException e) { e.printStackTrace(); } if(date!=null){ c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); dateList.add(c.getTime()); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); c.set(Calendar.MILLISECOND, 0); dateList.add(c.getTime()); } return dateList; }
🤞输入:2022-07-01
✌输出:
Fri Jul 01 00:00:00 CST 2022
Fri Jul 01 23:59:59 CST 2022
当然这个日期你也可以自己格式化一下,格式化成需要的格式。
👉获取年月日,并且拼接起来 分隔符
某些情况下,我们的接口有这样的功能,根据指定的年月日查询信息,如果前台没有传年月日,那么我们就获取当前年与日进行查询,于是我就写了个工具方法,代码如下:
/** * 获取年月日,并且拼接起来 分隔符 */ public static String getDateYearAndMonthAndDay(String year,String month,String day,String separator) { //分隔符如果是空的话,则是- separator = Strings.isBlank(separator) ? "-" : separator; //如果年月日不传的话,获取当前的年月日 StringBuilder currDate = new StringBuilder(); Calendar date = Calendar.getInstance(); year = Strings.isBlank(year) ? date.get(Calendar.YEAR) + "" : year; month = Strings.isBlank(month) ? date.get(Calendar.MONTH) + 1 + "" : month; day = Strings.isBlank(day) ? date.get(Calendar.DAY_OF_MONTH) + "" : day; int m = Integer.parseInt(month); int d = Integer.parseInt(day); month = m < 10 ? "0" + m : m + ""; day = d < 10 ? "0" + d : d + ""; currDate.append(year).append(separator).append(month).append(separator).append(day); return currDate.toString(); }
🤞输入:null,null,null,null
✌输出:2022-07-09
或者:“2022”,null,null,“/”
✌输出:2022/07/09
最后一个参数是年月日之间的分隔符,前面的三个参数分别是年月日,可以选择性的传递