前言:发现开发过程当中要用到时间和日历的情况太多了,这里把我碰到的情况记录一下。
12,当前时间的上一季度时间(分别为年、第几季度、季度的首月)
正文:
public static int getMaxDay(int year, int month) { Calendar cal = Calendar.getInstance(); //创建对象。不用new Calendar()的原因是Calendar是一个抽象类,且其构造方法是protected cal.clear(); //将所有字段值和时间值设置为未定义。Calendar类在set的时候,并不会立即生效,只有在get的时候才会生效,所以要先清理 cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month-1); return time.getActualMaximum(Calendar.DAY_OF_MONTH); }
//meiosisDate 减数 //minuendDate 被减数 public static int daysBetween(Date meiosisDate,Date minuendDate) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); meiosisDate = sdf.parse(sdf.format(meiosisDate)); cal.setTime(meiosisDate); long time1 = cal.getTimeInMillis(); minuendDate = sdf.parse(sdf.format(minuendDate)); cal.setTime(minuendDate); long time2 = cal.getTimeInMillis(); long between_days=(time1-time2)/(1000*3600*24); return Integer.parseInt(String.valueOf(between_days)); }
//查询当前日期前(后)x天的日期(如果day数为负数,说明是此日期前的天数) public static String beforeNumberDay(int day) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date now = new Date(); Calendar c = Calendar.getInstance(); c.setTime(now); c.add(Calendar.DAY_OF_YEAR, day); String theDate = sdf.format(c.getTime()); return theDate; }
//获取某日期的前(后)N月的年月 public static String yearMonthPrevNumber(String theDate, int num) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); Date date = sdf.parse(theDate); Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH, num); Date resultDate = c.getTime(); String yearMonthPrevNumber = sdf.format(resultDate); return yearMonthPrevNumber; }
public static boolean isWeekend(Date date) { boolean isWeekend = false; Calendar cal = Calendar.getInstance(); cal.setTime(date); if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { isWeekend = true; } return isWeekend; }
//@return int(date1>date2?1, date1<date2?-1, date1=date2?0, 其它0) public static int compareDate(Date date1, Date date2) { try { if (date1.getTime() > date2.getTime()) { return 1; } else if (date1.getTime() < date2.getTime()) { return -1; } else { return 0; } } catch (Exception exception) { exception.printStackTrace(); } return 0; }
也可以用compareTo方法进行比较,该方法可以直接比较String格式的日期
//@return int(date1>date2?1, date1<date2?-1, date1=date2?0, 其它0) public static int compareDate(Date date1, Date date2) { try { int result = date1.compareTo(date2) if (result > 0) { return 1; } else if (result < 0) { return -1; } else { return 0; } } catch (Exception exception) { exception.printStackTrace(); } return 0; }
//thedate是生日 public static int formatAge(Date thedate){ int age = 0; Date now = new Date(); String year = sdf_year.format(thedate); String this_year = sdf_year.format(now); String month = sdf_month.format(thedate); String this_month = sdf_month.format(now); age = Integer.parseInt(this_year) - Integer.parseInt(year); if(this_month.compareTo(month) < 0) { age -= 1; } if(age < 0) { age = 0; } return age; }
private static final long ONE_MINUTE = 60; private static final long ONE_HOUR = 3600; private static final long ONE_DAY = 86400; public static String fromToday(Date thedate) { Date calculate_thedate = null; try { calculate_thedate = sdf.parse(sdf.format(thedate)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); return ""; } Calendar calculate_calendar = Calendar.getInstance(); calculate_calendar.setTime(calculate_thedate); Calendar calendar = Calendar.getInstance(); calendar.setTime(thedate); long calculate_time = calculate_thedate.getTime() / 1000; long time = thedate.getTime() / 1000; long now = new Date().getTime() / 1000; long calculate_ago = now - calculate_time; long ago = now - time; if(calculate_ago > ONE_DAY * 5){ return sdf.format(thedate); }else{ if (ago <= ONE_HOUR){ long theTime = ago / ONE_MINUTE; if(theTime == 0){ return "刚刚"; } return theTime + "分钟前"; }else if(ago < ONE_DAY){ return ago / ONE_HOUR + "小时前"; }else if (calculate_ago < ONE_DAY * 2){ return "昨天" + " "+ sdf_hm.format(thedate); }else if (calculate_ago < ONE_DAY * 3){ return "前天" + " "+ sdf_hm.format(thedate); }else{ long day = calculate_ago / ONE_DAY; return day + "天前" + " "+ sdf_hm.format(thedate); } } }
public static Boolean isToday(Date date) { String today = CalendarUtil.DtoSymd(new Date()); String param = CalendarUtil.DtoSymd(date); return today.equals(param); }
public static String dateToWeek(Date date) { String[] weekDays = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" }; Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; return weekDays[dayOfWeek]; }
public static int getQuarter() { int month = getMonth(new Date()); return (month-1)/3+1; }
12,当前时间的上一季度时间(分别为年、第几季度、季度的首月)
public static int[] getLastQuarter() { Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int quarter = (month - 1) / 3 + 1; //第一季度 的 上一季度,就是去年的4季度 if(quarter == 1){ year = year - 1; quarter = 4; }else{ quarter = quarter - 1; } int firstMonth = quarter * 3 - 2; int[] ary = new int[3]; ary[0] = year; ary[1] = quarter; ary[2] = firstMonth; return ary; }
注:因为春节月可能在1月或者2月,所以年月需要事先写好在json文件中。也可以用其他方法,这里只是提供一种思路
public static boolean chinaSpringMonth(Integer year, Integer month) { ObjectMapper mapper = new ObjectMapper(); TypeFactory typeFactory = mapper.getTypeFactory(); CollectionType collectionType = typeFactory.constructCollectionType(List.class, SpringMonthVo.class); List<SpringMonthVo> list = new ArrayList<>(); try { InputStream is = SpringMonthVo.class.getResourceAsStream("/springMonth.json"); list = mapper.readValue(is, collectionType); } catch (IOException e) { e.printStackTrace(); } long flag = list.stream().filter(i -> i.getYear() == year && i.getSpringMonth() == month).count(); return flag >= 1 ? true : false; }
springMonth.json
[ {"year": 2020, "springMonth": 1}, {"year": 2021, "springMonth": 2}, {"year": 2022, "springMonth": 2}, {"year": 2023, "springMonth": 1}, {"year": 2024, "springMonth": 2}, {"year": 2025, "springMonth": 1}, {"year": 2026, "springMonth": 2}, {"year": 2027, "springMonth": 2}, {"year": 2028, "springMonth": 1}, {"year": 2029, "springMonth": 2}, {"year": 2030, "springMonth": 2}, {"year": 2031, "springMonth": 1}, {"year": 2032, "springMonth": 2} ]
(1)根据当前日期获得所在周的日期区间(周一和周日日期)
public String getTimeInterval(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 cal.setFirstDayOfWeek(Calendar.MONDAY); // 获得当前日期是一个星期的第几天 int day = cal.get(Calendar.DAY_OF_WEEK); // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); String imptimeBegin = sdf.format(cal.getTime()); // System.out.println("所在周星期一的日期:" + imptimeBegin); cal.add(Calendar.DATE, 6); String imptimeEnd = sdf.format(cal.getTime()); // System.out.println("所在周星期日的日期:" + imptimeEnd); return imptimeBegin + "," + imptimeEnd; }
(2)根据当前日期获得上周的日期区间(上周周一和周日日期)
public String getLastTimeInterval() { Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1; int offset1 = 1 - dayOfWeek; int offset2 = 7 - dayOfWeek; calendar1.add(Calendar.DATE, offset1 - 7); calendar2.add(Calendar.DATE, offset2 - 7); // System.out.println(sdf.format(calendar1.getTime()));// last Monday String lastBeginDate = sdf.format(calendar1.getTime()); // System.out.println(sdf.format(calendar2.getTime()));// last Sunday String lastEndDate = sdf.format(calendar2.getTime()); return lastBeginDate + "," + lastEndDate; }
(3)获取一周开始到结束的list集合
public static List<Date> findDates(Date dBegin, Date dEnd) { List lDate = new ArrayList(); lDate.add(dBegin); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(dBegin); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(dEnd); // 测试此日期是否在指定日期之后 while (dEnd.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.DAY_OF_MONTH, 1); lDate.add(calBegin.getTime()); } return lDate; }
注:重合的情况有四种,所以我们反过来判断,不重合的情况是有两种
重叠:
-------------------------1 ------------------------ A. |---------------| B. |----------------------| -------------------------2 ------------------------ A. |------------------------| B. |-------------------------| -------------------------3------------------------ A. |------------------------| B. |---------------------------------| -------------------------4------------------------ A. |------------------------| B. |------------------|
不重叠:
-------------------------1 ------------------------ A. |---------------| B. |----------------------| -------------------------2 ------------------------ A. |------------------------| B. |------------|
方法:
if (aEnd > bBegin || bEnd > aBegin) { //不重叠 } else { //重叠 }
public static int getWeekOfYear(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.setTime (date); return c.get(Calendar.WEEK_OF_YEAR); }
参考博客:
1,Java 取得 30 分钟前的时间 字符串格式 - wide288 的短文 - CSDN博客
https://blog.csdn.net/wide288/article/details/78519810
2,java获得当前时间一小时前的时间 - daoshud1的专栏 - CSDN博客
https://blog.csdn.net/daoshud1/article/details/77646231
3,计算时间差获取大概的时间 如:多少秒前,多少分钟前 - 一起进步的博客 - CSDN博客
https://blog.csdn.net/qq_27292113/article/details/51150072?utm_source=blogxgwz0
4,JAVA的系统时间输出以及判断今天是星期几 - 王洋的专栏 - CSDN博客
https://blog.csdn.net/wangyang1354/article/details/8033707
5,Java 计算2个时间相差多少年,多少个月,多少天的几种方式 —技术博客
https://www.sojson.com/blog/260.html
6,Java时间工具类(把日期时间转换成xx秒前、xx分钟前、xx小时前...) - 程序员_007的博客 - CSDN博客
https://blog.csdn.net/lzy1357986420/article/details/51988937
7,Java String类型时间比较大小 - maoyeqiu的专栏 - CSDN博客
https://blog.csdn.net/maoyeqiu/article/details/46432653
8,java中compareTo比较两个日期大小 - baifq的记录博客 - CSDN博客
https://blog.csdn.net/u013960139/article/details/51332128
9,java获取本周 上周的所有日期 - 夕阳下的无名草 - 博客园
https://www.cnblogs.com/xzjf/p/7600676.html
10,求判断两个时间段有没有重叠的算法-CSDN论坛
https://bbs.csdn.net/topics/360003491
11,JAVA中用CALENDAR类计算周和周的起始日期(转) - xSTARx - ITeye博客
https://407827531.iteye.com/blog/1457316