Java代码获取日期、日期转换以及MySQL中first_day()、last_day()、timestampdiff()、date_add()函数的代码实现

package com.atguigu.time;

import org.junit.Test;

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

/**
 * 涵盖所有时间相关的方法
 *  格式化时间[时间字符串]、获取单独的年、月、日、时、分、秒、星期信息等使用SimpleDateFormat即可。
 *  判断平年和闰年使用:new GregorianCalendar().isLeapYear()方法。
 *  Calendar类既可以通过setTime方法设置日历,也可以通过set方法将单独的年、月、日、时、分、秒设置到日历中。
 *      设置完成后再次获取的时候就可以获取新的日历信息。
 *  在基本时间上加减时间用Calendar的add方法或set方法都可以。
 *  Calender使用前需要使用clear()方法清除缓存。
 */
public class MyTimeTest {
    private DateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
    private DateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd");
    private DateFormat sdfyyyy=new SimpleDateFormat("yyyy");
    private DateFormat sdfMM=new SimpleDateFormat("MM");
    private DateFormat sdfdd=new SimpleDateFormat("dd");//当前月份的第几天
    private DateFormat sdfHH=new SimpleDateFormat("HH");
    private DateFormat sdfmm=new SimpleDateFormat("mm");
    private DateFormat sdfss=new SimpleDateFormat("ss");
    private DateFormat sdfDD=new SimpleDateFormat("DD");//一年中的第几天
    private DateFormat sdfE=new SimpleDateFormat("E");//本周第几天
    private DateFormat sdfEEEE=new SimpleDateFormat("EEEE");//今天是星期几
    private DateFormat sdfW=new SimpleDateFormat("W");//本月第几个星期
    private DateFormat sdfww=new SimpleDateFormat("ww");//本年第几个星期
    private Date date=new Date();//当前时间
    private Calendar calendar = Calendar.getInstance();//Calendar对象
    /**
     * 获取时间的方法
     *  获取时间使用new SimpleDateFormat("时间格式").format(new Date())返回时间字符串
     *  获取时间使用Calendar.getInstance().get(Calendar.HOUR)返回数字
     *  两种方式都能获取到时间,只是一个返回字符串,一个返回数据。
     */
    @Test
    public void ObtainTime(){
        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        //时间
        System.out.println("当前时间:"+sdf1.format(date)+"(simpleDateFormat构造器中的参数可以多了解一下)");
        System.out.println("当前时间戳:"+System.currentTimeMillis());
        System.out.println("当前年份:"+sdfyyyy.format(date));
        System.out.println("当前月份:"+sdfMM.format(date));
        System.out.println("当前天数:"+sdfdd.format(date));
        System.out.println("当前小时数:"+sdfHH.format(date));
        System.out.println("当前分数:"+sdfmm.format(date));
        System.out.println("当前秒数:"+sdfss.format(date)+"\n");
        //天数
        System.out.println("当前时间是一年中第几天:"+sdfDD.format(date));
        System.out.println("当前时间是一周中第几天(周一为第一天):"+sdfE.format(date));
        System.out.println("给定年份的总天数:"+(new GregorianCalendar().isLeapYear(2020)?366:365));
        System.out.println("给定月份的总天数:"+calendar.getActualMaximum(Calendar.DATE));
        //星期数
        System.out.println("当前时间是本月第几个星期:"+sdfW.format(date));
        System.out.println("当前时间是今年第几个星期:"+sdfww.format(date));
        System.out.println("当前时间是星期几:"+sdfEEEE.format(date));
    }
    /**
     * 时间转换方法
     */
    @Test
    public void convertTime() throws ParseException {
        /**
         * 特定格式字符串转时间、时间戳
         */
        Date stringToTime = sdf1.parse("2021-12-12-13:12:12");//时间字符串转时间
        long stringToTimestamp = sdf1.parse("2021-12-12-13:12:12").getTime();//时间字符串转时间戳
        System.out.println("字符串转时间:"+stringToTime+"\n字符串转时间戳:"+stringToTimestamp+"\n=================================");
        /**
         * 时间、时间戳转指定格式字符串
         */
        String timeToString = sdf1.format(date);
        String timestampToString = sdf1.format(date.getTime());
        System.out.println("时间转字符串:"+timeToString+"\n时间戳转字符串:"+timestampToString+"\n=================================");
        /**
         * 时间和时间戳互转
         */
        Long timestamp = date.getTime(); //当前时间戳
        System.out.println("13位时间戳转10位时间戳:"+timestamp/1000L);
        System.out.println("13位时间戳转时间:"+new Date(timestamp));
        System.out.println("时间转13位时间戳:"+date.getTime());
        System.out.println("sql date转util date:"+new java.sql.Date(date.getTime()));
        System.out.println("util date转sql date:"+(Date)new java.sql.Date(1634875864438L));
        //java.sql.Date()类是java.util.Date()类的子类。前者只能表示年月日  后者可以表示年月日时分秒
    }
    /**
     *  时间运算
     *     求本月第一天
     * @param strDate 时间字符串,格式必须为“yyyy-MM-dd”
     * @return 返回本月第一天的字符串表示,格式为“yyyy-MM-dd”
     */
    public String first_day(String strDate){
        int yyyy=0;
        int MM=0;
        try{
            Date date = sdf2.parse(strDate);//格式化时间
            //获取年份和月份
            yyyy = Integer.parseInt(sdfyyyy.format(date));
            MM = Integer.parseInt(sdfMM.format(date));
        }catch(ParseException e){
            e.printStackTrace();
            return "输入的时间字符串格式有误";  //格式转换错误直接在catch中结束
        }
        //将日历设置为当前月份第一天
        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.set(Calendar.YEAR,yyyy);
        calendar.set(Calendar.MONTH,MM-1);
        int firstDayNum = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
        calendar.set(Calendar.DAY_OF_MONTH,firstDayNum);
        //格式化输出
        String firstDay = sdf2.format(calendar.getTime());
        return firstDay;
    }

    /**
     *  时间运算
     *     求本月最后一天
     * @param strDate 时间字符串,格式必须为“yyyy-MM-dd”
     * @return 返回本月最后一天的字符串表示,格式为“yyyy-MM-dd”
     */
    public String last_day(String strDate){
        int yyyy=0;
        int MM=0;
        try{
            Date date = sdf2.parse(strDate);//格式化时间
            //获取年份和月份
            yyyy = Integer.parseInt(sdfyyyy.format(date));
            MM = Integer.parseInt(sdfMM.format(date));
        }catch(ParseException e){
            e.printStackTrace();
            return "输入的时间字符串格式有误";  //格式转换错误直接在catch中结束
        }
        //将日历设置为当前月份最后一天
        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.set(Calendar.YEAR,yyyy);
        calendar.set(Calendar.MONTH,MM-1);
        int lastDayNum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        calendar.set(Calendar.DAY_OF_MONTH,lastDayNum);
        //格式化输出
        String lastDay = sdf2.format(calendar.getTime());
        return lastDay;
    }

    @Test
    public void testFirstAndLastDay(){
        System.out.println(first_day("2021-10-25"));
        System.out.println(last_day("2021-10-25"));
    }
    /**
     *  传入的时间字符串格式为:"yyyy-MM-dd-HH:mm:ss"或“yyyy-MM-dd”
     * @param timeUnit 比较的单位,可选值有“YEAR”,"MONTH","DAY","HOUR","MINUTE","SECOND"
     * @param startTime  起始时间字符串(用作减数)
     * @param endTime    结束时时间字符串(用作被减数)
     */
    public String timeStampdiff(String timeUnit, String startTime, String endTime) {
        Integer result=null;
        Date startDate=null;
        Date endDate=null;
        /**
         * 将输入时间转换为标准格式的时间字符串"yyyy-MM-dd-HH:mm:ss"
         */
        try{
            if(startTime.trim().length()==10){
                startDate = sdf1.parse(new StringBuilder().append(startTime).append("-00:00:00").toString());
            }else{
                startDate=sdf1.parse(startTime);
            }
            if(endTime.trim().length()==10){
                endDate = sdf1.parse(new StringBuilder().append(endTime).append("-00:00:00").toString());
            }else{
                endDate=sdf1.parse(endTime);
            }
        }catch(ParseException e){
            e.printStackTrace();
            return "输入日期格式有误,请重新输入!!";
        }
        long timestampDiff=endDate.getTime() - startDate.getTime();

        /**
         * 获取endDate和startDate各个时间单位上的差值
         */
        Integer yyyy=Integer.parseInt(sdfyyyy.format(endDate))-Integer.parseInt(sdfyyyy.format(startDate));
        Integer MM=Integer.parseInt(sdfMM.format(endDate))-Integer.parseInt(sdfMM.format(startDate));
        Integer dd=Integer.parseInt(sdfdd.format(endDate))-Integer.parseInt(sdfdd.format(startDate));
        Integer HH=Integer.parseInt(sdfHH.format(endDate))-Integer.parseInt(sdfHH.format(startDate));
        Integer mm=Integer.parseInt(sdfmm.format(endDate))-Integer.parseInt(sdfmm.format(startDate));
        Integer ss=Integer.parseInt(sdfss.format(endDate))-Integer.parseInt(sdfss.format(startDate));

        switch (timeUnit){
            case "YEAR":result=yyyy;break;
            case "MONTH": result=yyyy*12+MM;break;
            case "DAY":{//每个月的天数不一样啊 相差一秒钟,可能同一天也可能不是同一天
                if(yyyy==0 && MM==0 && dd==0){
                    result=0;
                }else{
                    result=(int)Math.ceil(timestampDiff/(1000.0*60*60*24));
                }
                break;
            }
            case "HOUR":{
                if(yyyy==0 && MM==0 && dd==0 && HH==0){
                    result=0;
                }else{
                    result=(int)Math.ceil(timestampDiff/(1000.0*60*60));
                }
                break;
            }
            case "MINUTE":{
                if(yyyy==0 && MM==0 && dd==0 && HH==0 && mm==0){
                    result=0;
                }else{
                    result=(int)Math.ceil(timestampDiff/(1000.0*60));
                }
                break;
            }
            case "SECOND":{
                if(yyyy==0 && MM==0 && dd==0 && HH==0 && mm==0 && ss==0){
                    result=0;
                }else{
                    result=(int)Math.ceil(timestampDiff/(1000.0));
                }
                break;
            }
            default:return "时间单位不匹配,请重新输入!!";
        }
        return result.toString();
    }

    @Test
    public void testTimestampdiff() {
        String startDate="2010-12-13-14:00:00";
        String endDate="2020-11-11";
        System.out.println(timeStampdiff("YEAR", startDate, endDate));
        System.out.println(timeStampdiff("MONTH", startDate, endDate));
        System.out.println(timeStampdiff("DAY", startDate, endDate));
        System.out.println(timeStampdiff("HOUR", startDate, endDate));
        System.out.println(timeStampdiff("MINUTE", startDate, endDate));
        System.out.println(timeStampdiff("SECOND", startDate, endDate));
    }

    /**
     * 在给定的时间字符串基础上进行日期的加减
     *  传入的时间字符串格式为:"yyyy-MM-dd-HH:mm:ss"或“yyyy-MM-dd”
     * @param strDate 给定的时间字符串
     * @param timeUnit 时间单位,选值有“YEAR”,"MONTH","DAY","HOUR","MINUTE","SECOND"
     * @param num   偏移量大小,正负均可
     * @return  返回格式 "yyyy-MM-dd-HH:mm:ss"
     */
    public String date_add(String strDate,String timeUnit,Integer num) {
        Date inputDate=null;
        try {
            if(strDate.length()==10){
                inputDate=sdf1.parse(new StringBuilder().append(strDate).append("-00:00:00").toString());
            }else{
                inputDate=sdf1.parse(strDate);
            }
        } catch (ParseException e) {
            e.printStackTrace();
            return "您输入的格式有误!!";
        }
        /**
         * 设置输入日期为当前日历时间
         */
        calendar.clear();
        calendar.setTime(inputDate);//将输入时间设置为当前日历
        /**
         * 用add方法和set方法均可
         */
        switch (timeUnit){//根据输出重新设置日历
            case "YEAR":{ calendar.add(Calendar.YEAR,num);break;}
            case "MONTH":{ calendar.add(Calendar.MONTH,num);break;}//月份角标从0开始
            case "DAY":{ calendar.add(Calendar.DAY_OF_MONTH,num);break;}//不能是DAY_OF_YEAR
            case "HOUR":{calendar.add(Calendar.HOUR_OF_DAY,num);break;}
            case "MINUTE":{calendar.add(Calendar.MINUTE,num);break;}
            case "SECOND":{calendar.add(Calendar.SECOND,num);break;}
            default:System.out.println("时间单位不匹配,请重新输入!!");
        }
        return sdf1.format(calendar.getTime());
    }

    @Test
    public void testDateAdd(){
        System.out.println("年:"+date_add(sdf1.format(date),"YEAR",-1));
        System.out.println("月:"+date_add(sdf1.format(date),"MONTH",-10));
        System.out.println("日:"+date_add(sdf1.format(date),"DAY",7));
        System.out.println("日:"+date_add(sdf1.format(date),"DAY",-26));
        System.out.println("时:"+date_add(sdf1.format(date),"HOUR",13));
        System.out.println("时:"+date_add(sdf1.format(date),"HOUR",-17));
        System.out.println("分:"+date_add(sdf1.format(date),"MINUTE",20));
        System.out.println("分:"+date_add(sdf1.format(date),"MINUTE",-50));
        System.out.println("秒:"+date_add(sdf1.format(date),"SECOND",50));
        System.out.println("秒:"+date_add(sdf1.format(date),"SECOND",-50));
    }
}
package com.atguigu.time;

import org.junit.Test;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class MyCalendarTest {
    private DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    private Calendar calendar = Calendar.getInstance();

    /**
     * 获取年月日时分秒毫秒天数星期数等
     */
    @Test
    public void obtainTime(){
        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.setTime(new Date());//将当前时间设置成日历
        //年月日时分秒
        System.out.println("年:"+calendar.get(Calendar.YEAR));
        System.out.println("月:"+calendar.get(Calendar.MONTH));//结果加1才是当前月份
        System.out.println("日:"+calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println("日:"+calendar.get(Calendar.DATE));
        System.out.println("时:"+calendar.get(Calendar.HOUR_OF_DAY));
        System.out.println("分:"+calendar.get(Calendar.MINUTE));
        System.out.println("秒:"+calendar.get(Calendar.SECOND));
        System.out.println("毫秒:"+calendar.get(Calendar.MILLISECOND));
        //天数与星期
        System.out.println("给定年份的总天数:"+(new GregorianCalendar().isLeapYear(2020)?366:365));
        System.out.println("一年中第几天:"+calendar.get(Calendar.DAY_OF_YEAR));
        System.out.println("一年中第几个星期:"+calendar.get(Calendar.WEEK_OF_YEAR));
        System.out.println("一月中第几星期:"+calendar.get(Calendar.WEEK_OF_MONTH));
        System.out.println("一月中第几星期:"+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));//[1,7]\[8,14]...天对应第1、2个星期
        System.out.println("一星期中第几天:"+calendar.get(Calendar.DAY_OF_WEEK));//DAY_OF_WEEK中星期天的索引为1
    }

    @Test
    public void calculateTime(){
        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.setTime(new Date());//将当前时间设置成日历
        calendar.set(Calendar.DATE,calendar.getActualMinimum(Calendar.DATE));
        System.out.println("本月第一天:"+ sdf.format(calendar.getTime()));

        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.setTime(new Date());//将当前时间设置成日历
        calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DATE));
        System.out.println("本月最后一天:"+ sdf.format(calendar.getTime()));

        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.setTime(new Date());//将当前时间设置成日历
        calendar.add(Calendar.DAY_OF_MONTH,1);
        System.out.println("当前日期加一天:"+sdf.format(calendar.getTime()));

        calendar.clear();//calendar实例初始化后使用前应该先清除缓存
        calendar.set(2021,2,1);//将日期设为3月1号
        calendar.add(Calendar.DAY_OF_MONTH,-1);//3月1号前推一天
        System.out.println("1为平年,0为润年:"+(calendar.get(Calendar.DAY_OF_MONTH)==28?1:0));
    }

    /**
     * GregorianCalendar是Calendar的子类,一般多用于传入数字设置日期。
     */
    @Test
    public void testGregorianCalendar(){
        GregorianCalendar gc1 = new GregorianCalendar(2020,11,11);//直接设置日期
        System.out.println(" 当前时间:"+gc1.getTime());//打印时间
        gc1.add(Calendar.DAY_OF_MONTH,2);//前移两天
        System.out.println(" 当前时间:"+gc1.getTime());

        GregorianCalendar gc2 = new GregorianCalendar();//实例化后再传入日期
        gc2.set(2000,10,10);
        System.out.println(" 当前时间:"+gc2.getTime());

        System.out.println("是否是闰年:1是,0否"+(gc2.isLeapYear(2000)?1:0));
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值