JAVA使用Calendar类获取日期

1 参考文档

快速获取当天0点0分0秒(00:00:00),23点59分59秒(23:59:59) | 不羁鱼Karle-CSDN

Java中Calendar基本使用 | 谷半仙-CSDN

Calendar | Elven_Shi-OSCHINA


2 Calendar基本方法

2.1 Calendar中的常用日历字段

日历字段 Value
YEAR 当前年份
MONTH 当前月份( 注:初始值是从0开始,所以得到的比实际月份小1月)
DATE 一个月中的某天
WEEK_OF_YEAR 当前年中的第几个星期
WEEK_OF_MONTH 当前月中的第几个星期
DAY_OF_MONTH 一个月中的第几天
DAY_OF_YEAR 一年中的第几天
DAY_OF_WEEK 一个星期中的第几天
DAY_OF_WEEK_IN_MONTH 当前月中的第几个星期(注:当前月第1-7天是第一个星期,8-14是第二个星期,以此类推)
HOUR_OF_DAY 一天中的第几个小时
MINUTE 一小时中的第几分钟
SECOND 一分钟中的第几秒
MILLISECOND 一秒中的第几毫秒

2.2 取值语句

Calendar cal = Calendar.getInstance();
//查看上表的字段给KKK赋值
cal.get(Calendar.KKK);							

//例如
cal.get(Calendar.DATE);							//当天 1-31
cal.getMaximum(Calendar.DATE);					//这个月的天数
cal.getMinimum(Calendar.DATE);					//这个月第一提案

2.3 赋值语句

// 对以上每个字段进行赋值,代码重复较大
cal.set(Calendar.KKK, VVVV);	
	
// 分别对字段进行赋值,效率高			
cal.set(year,month,date,hour,minute,second);	

2.4 计算语句

//一般不使用,原因是该方法只在一个月里面循环计算,其大小不会超过该月最值
cal1.roll(Calendar.KKK,VVV);

//使用 XX_OF_XX 的field进行加减计算效果更佳,而且计算准确
cal1.add(Calendar.KKK,VVV);

关于add的计算:

例子1:获取下个月第1天。
先调到下个月:cal1.add(Calendar.MONTH, 1);
如果当前为5-31,那么,加一个月的话就是6-30;
设置为这个月中的第1天: cal.set(Calendar.DAY_OF_MONTH, 1);

例子2:获取下个月最后1天。
先调到下2个月:cal1.add(Calendar.MONTH, 2);
设置为这个月中的第0天: cal.set(Calendar.DAY_OF_MONTH, 0);
理解为:下2个月的第1天 - 1天 = 下个月最后1天


3 个人需求

  1. 获得下个月的天数;
  2. 根据下个月第几天获得该天的日期;
  3. 获得下个月第一天(00:00:00)和最后一天(23:59:59)的日期。

4 计算日期工具类

4.1 工具类代码

import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

//计算日期工具类
@Component
public class DateUtils {
    //获得下个月的天数
    public static int getNextMonthDays() {
        //获取下月的第一天
        Calendar calendar = Calendar.getInstance();
        //调到下个月
        calendar.add(Calendar.MONTH, 1);
        //下个月的天数
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        return days;
    }

    //根据下个月第几天获得该天的日期
    public static Date getNextMonthByDay(int day) {
        //获取下月的第一天
        Calendar calendar = Calendar.getInstance();
        //获取下个月的那一天
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, day, 0, 0, 0);
//        cal.set(Calendar.DAY_OF_MONTH, day);
        Date date = calendar.getTime();
        return date;
    }

    //获得下个月第一天和最后一天的日期
    public static Date getFirstDate() {
        //获取下月的第一天0点0分0秒
        Calendar calendar = Calendar.getInstance();
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, 0, 23, 59, 59);
        Date firstDate = calendar.getTime();
        return firstDate;
    }

    //获取下月的最后一天23点59分59秒
    public static Date getLastDate() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 2, 0, 23, 59, 59);
        Date lastDate = calendar.getTime();
        return lastDate;
    }

    //计算日期 value +1代表日期的第二天 -1代表这个日期的前一天 以此类推
    public static String calculateDate(String scheduleDate, Integer value) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();

        //获取那天日期
        Date date = simpleDateFormat.parse(scheduleDate);
        //获取那天
        calendar.setTime(date);
        //获取那天的明天
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE) + value, 0, 0, 0);
        //转化为String类型
        String tomorrow = simpleDateFormat.format(calendar.getTime());
        return tomorrow;
    }
}

4.2 测试方法

public static void main(String[] args) {
	//测试方法1
    int nextMonthDays = getNextMonthDays();
   	System.out.println("下个月的天数是:" + nextMonthDays);

     //测试方法2
     int day = 3;
     Date nextMonthByDay = getNextMonthByDay(day);
     System.out.println("下个月的第" + day + "天是:" + nextMonthByDay);

     //测试方法3
     Date firstDate = getFirstDate();
     System.out.println("下个月的第一天是:" + firstDate);

     //测试方法4
     Date lastDate = getLastDate();
     System.out.println("下个月的第最后一天是:" + lastDate);

     //测试方法5
     int value = 2;
     String date = calculateDate("2022-01-01", value);
     System.out.println("日期:2022-01-01过" + value + "天,日期变为:" + date); 
}

4.3 输出结果

JAVA使用Calendar类获取日期_第1张图片


5 其他方法

5.1 计算日期差

  1. 实体类

     @JsonFormat(pattern="yyyy-MM-dd", timezone="GMT+8")
     private Date startDate;//请假开始日期
    
     @JsonFormat(pattern="yyyy-MM-dd", timezone="GMT+8")
     private Date endDate;//请假结束日期
    
  2. 方法

    //计算日期差
    private Integer getDuration(Date startDate, Date endDate){
    	//计算日期差
    	long difParse = endDate.getTime() - startDate.getTime();
    	//例如:1月1号请假开始 到 1月1号请假结束,算是一天,所以+1
    	Integer result = Math.toIntExact(difParse / (24 * 60 * 60 * 1000) + 1);
    	return result;
    }
    

5.2 计算时间差

  1. 实体类

     @JsonFormat(pattern="HH:mm:ss")
     private Date startTime;//班次开始时间
    
     @JsonFormat(pattern="HH:mm:ss")
     private Date endTime;//班次结束时间
    
  2. 方法

    //计算时间差
    private double getDuration(Date startTime, Date endTime){
        //如果下班时间小于上时间,代表下班为第二天,则需要将在原时间加上24小时,即一天
        if (endTime.before(startTime)) {//比较上班和下班时间,如果下班时间小于上班时间
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(endTime);//设置时间
            calendar.add(Calendar.DATE, 1);//在该时间加上一天
            endTime = calendar.getTime();//新的下班日期
        }
        long result = endTime.getTime() - startTime.getTime();//计算时间差
        double duration = result / (1000.0 * 60 * 60);//转化为小时
    
        return duration;
    }
    

5.3 判断两个日期是否相等

SimpleDateFormat format = new SimpleDateFormat("yyyy-MMd-d");
boolean equals = format.format(date1).equals(format.format(date2));

你可能感兴趣的:(Java,java)