1. 程式人生 > >Java根據傳入Date計算所在周、月、季度時間

Java根據傳入Date計算所在周、月、季度時間

 

package com.rdmu.schedulingmeetingplace.common;

import org.hibernate.annotations.SourceType;

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

/**
 * Calendar操作Date
 */
public class Test {

    /**設定初始值*/
    private static Calendar cal;

    /**
     * 根據當前系統時區定義Calendar
     */
    static {
        cal = Calendar.getInstance();
    }

    /**
     * Date-->String 轉換
     * @param date
     * @return
     */
    public static String dateToString(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    /**
     * 獲取指定日期在一週中的第幾天
     * @param date
     */
    public static void getDayOfWeek(Date date){
        int dayOfWeek = cal.DATE;
        System.out.println(dayOfWeek);
    }

    /**
     * 獲取指定日期是月中的第幾天
     * @param date
     */
    public static void getDayOfMonth(Date date){
        int day = date.getDate();
        System.out.println(day);
    }

    /**
     * 獲取指定時間所在月份
     * @param date
     */
    public static void getMonth(Date date){
        cal.setTime(date);
        //老外計算月份從0開始,轉換為國內月份需要加1
        int month = cal.get(cal.MONTH) + 1;
        System.out.println(month);
    }

    /**
     * 獲取指定時間所在周的週一(一天中最小時間)和周天(一天中最大時間)
     * @param date
     */
    public static void getFristAndLashOfWeekDay(Date date){
        cal.setTime(date);
        cal.set(cal.DAY_OF_WEEK,cal.MONDAY);
        Date mondayOld = cal.getTime();
        //老外的一週從周天開始,使用cal.SUNDAY獲取到的是上週的周天
        cal.set(cal.DAY_OF_WEEK,cal.SATURDAY);
        //獲取週六,加上一天的毫秒數,計算所在週週天,
        cal.setTimeInMillis(cal.getTimeInMillis()+24*60*60*1000);
        Date sundayOld = cal.getTime();

        //考慮到使用判斷獲取資料時存在部分資料不顯示問題,逐將日期格式化處理
        Date mondayNew = mondayOld;
        Date sundayNew = sundayOld;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
            mondayNew = sdf.parse(sdf.format(mondayOld));
            cal.setTime(sdf.parse(sdf.format(sundayOld)));
            //用日期獲取資料時會由1秒誤差,若要求比較嚴格,建議不減1,獲取下一天的開始時間
            cal.setTimeInMillis(cal.getTimeInMillis()+24*60*60*1000-1);
            sundayNew = cal.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            System.out.println("執行類:" + Test.class + "中方法:getStartAndEndWeekDay(Date date) 異常");
        }
        System.out.println(mondayNew);
        System.out.println(String.valueOf(sundayNew));
    }

    /**
     * 獲取指定時間所在月的第一天(一天中最小時間)和最後一天(一天中最大時間)
     * @param date
     */
    public static void getFristAndLashOfMonthDay(Date date){
        cal.setTime(date);
        cal.set(cal.DAY_OF_MONTH,1);
        Date firstDay = cal.getTime();
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        Date lastDay = cal.getTime();

        //考慮到使用判斷獲取資料時存在部分資料不顯示問題,逐將日期格式化處理
        Date firstDayNew = firstDay;
        Date lastDayNew = lastDay;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
            firstDayNew = sdf.parse(sdf.format(firstDay));
            cal.setTime(sdf.parse(sdf.format(lastDay)));
            //用日期獲取資料時會由1秒誤差,若要求比較嚴格,建議不減1,獲取下一天的開始時間
            cal.setTimeInMillis(cal.getTimeInMillis()+24*60*60*1000-1);
            lastDayNew = cal.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            System.out.println("執行類:" + Test.class + "中方法:getFristAndLashOfMonthDay(Date date) 異常");
        }

        System.out.println(firstDayNew);
        System.out.println(lastDayNew);
    }

    /**
     * 獲取指定時間所在季度的第一天(一天中最小時間)和最後一天(一天中最大時間)
     * @param date
     */
    public static void getFristAndLashOfDuarterDay(Date date){
        cal.setTime(date);
        int month = cal.get(cal.MONTH) + 1;
        int quarter = 0;
        //判斷季度
        if (month >= 1 && month <= 3) {
            quarter = 1;
        } else if (month >= 4 && month <= 6) {
            quarter = 2;
        } else if (month >= 7 && month <= 9) {
            quarter = 3;
        } else {
            quarter = 4;
        }
        //獲取指定時間所在季度第一天和最後一天
        Date firstDay = null;
        Date lastDay = null;
        String str = String.valueOf(date.getYear());
        String startDay = "";
        String endDay = "";
        switch (quarter){
            case 1://第一季度
                startDay = str + "-01-01 00:00:00";
                endDay = str + "-03-31 23:59:59";
                break;
            case 2://第二季度
                startDay = str + "-04-01 00:00:00";
                endDay = str + "-06-30 23:59:59";
                break;
            case 3://第三季度
                startDay = str + "-07-01 00:00:00";
                endDay = str + "-09-30 23:59:59";
                break;
            case 4://第四季度
                startDay = str + "-10-01 00:00:00";
                endDay = str + "-12-31 23:59:59";
                break;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            firstDay = sdf.parse(startDay);
            //用日期獲取資料時會由1秒誤差,若要求比較嚴格,建議不減1,獲取下一天的開始時間
            cal.setTime(sdf.parse(endDay));
            cal.setTimeInMillis(cal.getTimeInMillis()+24*60*60*1000-1);
            lastDay = cal.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(dateToString(firstDay));

        System.out.println(dateToString(lastDay));
    }

    public static void main(String[] args){
        Date date = new Date(119,1,11);
        System.out.println(dateToString(date));
        //獲取指定日期具體日
        getDayOfMonth(date);
        //獲取指定日期是周幾
        getDayOfWeek(date);
        //獲取指定時間所在月份
        getMonth(date);
        //獲取指定時間所在周的週一和周天
        getFristAndLashOfWeekDay(date);
        //獲取指定時間所在月的第一天和最後一天
        getFristAndLashOfMonthDay(date);
        //獲取指定時間所在季度第一天和最後一天
        getFristAndLashOfDuarterDay(date);
    }

}