JAVA Date 日期工具

该工具可以根据date返回的毫秒数与特定毫秒数,获取两个时间戳之间的时间段

 


Record类

 1 package timeUtil;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.UUID;
 6 
 7 public class Record {
 8 
 9         private Date date;
10         private UUID id;
11 
12         public Record(){
13             this.date=new Date();
14             this.id=UUID.randomUUID();
15         }
16 
17         public Record(UUID id){
18             this.id=id;
19             this.date=new Date();
20         }
21 
22         public Date getDate() {
23             return date;
24         }
25 
26         public void setDate(Date date) {
27             this.date = date;
28         }
29 
30      
31 
32         public UUID getId() {
33             return id;
34         }
35 
36 
37         public String getDateString(){
38             return new SimpleDateFormat("yyyy年MM月dd日").format(date);
39         }
40 }

 


工具类

package timeUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

public class TimeUtil {
    
    /**
     * 时间类型枚举,用于查询不同时间段的记录
     */
    public static enum DateType {
        today,
        lastWeek,
        lastOneMonth,
        lastThreeMonths,
        lastOneYear
    }
    
    /**
     * 计算时间间隔,单位为天数
     * @param startTime
     * @param endTime
     * @return
     */
    public static int equationOfDay(long startTime, long endTime) {
        startTime = dateToStamp(stampToDate(startTime));
        endTime = dateToStamp(stampToDate(endTime));
        int newL = (int) ((endTime - startTime) / (1000 * 3600 * 24));
        return newL;
    }

    /**
     * 计算时间间隔,单位为自然月
     * @param startTime
     * @param endTime
     * @return
     */
    public static int equationOfMonth(long startTime,long endTime){
        return equationOfMonth(stampToDate(startTime),stampToDate(endTime));
    }

    /**
     * 计算时间间隔,单位为年
     * @param startTime
     * @param endTime
     * @return
     */
    public static int equationOfYear(long startTime,long endTime){
        return equationOfMonth(startTime,endTime)/12;
    }


    private static int equationOfMonth(String startDate,String endDate){
        int result=0;
        try {
            SimpleDateFormat sfd=new SimpleDateFormat("yyyy-MM-dd");
            Date start = sfd.parse(startDate);
            Date end = sfd.parse(endDate);
            int startYear=getYear(start);
            int startMonth=getMonth(start);
            int startDay=getDay(start);
            int endYear=getYear(end);
            int endMonth=getMonth(end);
            int endDay=getDay(end);
            if (startDay>endDay){ //1月17  大于 2月28
                if (endDay==getDaysOfMonth(getYear(new Date()),2)){   //也满足一月
                    result=(endYear-startYear)*12+endMonth-startMonth;
                }else{
                    result=(endYear-startYear)*12+endMonth-startMonth-1;
                }
            }else{
                result=(endYear-startYear)*12+endMonth-startMonth;
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return result;
    }


    /**
     * 时间戳转换为时间
     * @param l
     * @return
     */
    public static String stampToDate(long l) {
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        long lt = l;
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }

    /**
     * 时间转换为时间戳
     * @param s
     * @return
     */
    public static long dateToStamp(String s) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = simpleDateFormat.parse(s);
            return date.getTime();
        } catch (java.text.ParseException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
            return -1;
        }
    }

    /**
     * 计算日期间相差天数、月份(相差的天数用1年2个月零3天格式展示)工具类
     */
    public static int getDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE);
    }

    /**
     * 返回日期的月份,1-12,即yyyy-MM-dd中的MM
     *
     * @param date
     * @return
     */
    public static int getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 返回日期的年,即yyyy-MM-dd中的yyyy
     *
     * @param date
     * @return int
     */
    public static int getYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    public static int getDaysOfMonth(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }


        /**
         * 获取相应时间段的记录
         * @param dateType
         * @return
         */
        public static List<Record> getRecordByDate(DateType dateType,List<Record> records){
            //获取系统时间,返回为秒,乘1000转换为毫秒
            final long currentSecends = System.currentTimeMillis();
            switch (dateType){
                case today:
                    return records.stream().
                            filter(record-> TimeUtil.equationOfDay(record.getDate().getTime(),currentSecends)==0)
                            .collect(Collectors.toList());
                case lastWeek:
                    return records.stream().
                            filter(record-> TimeUtil.equationOfDay(record.getDate().getTime(),currentSecends)<=7)
                            .collect(Collectors.toList());
                case lastOneMonth:
                    return records.stream().
                            filter(record-> TimeUtil.equationOfMonth(record.getDate().getTime(),currentSecends)<=1)
                            .collect(Collectors.toList());
                case lastThreeMonths:
                    return records.stream().
                            filter(record-> TimeUtil.equationOfMonth(record.getDate().getTime(),currentSecends)<=3)
                            .collect(Collectors.toList());
                case lastOneYear:
                    return records.stream().
                            filter(record-> TimeUtil.equationOfYear(record.getDate().getTime(),currentSecends)<=1)
                            .collect(Collectors.toList());
                    default:
                        return records;
            }
        }
        
        
}

 

 


单元测试

 1     public static void main(String[] args) {
 2              final long currentSecends = System.currentTimeMillis();
 3             List<Record> records = new ArrayList<Record>();
 4             Record today =new Record();
 5             Record yesterday = new Record();
 6             yesterday.setDate(new Date(dateToStamp("2018-7-26")));
 7             Record lastMonth = new Record();
 8             lastMonth.setDate(new Date(dateToStamp("2018-6-26")));
 9             Record lastTwoYear = new Record();
10             lastTwoYear.setDate(new Date(dateToStamp("2016-6-26")));
11             records.add(today);
12             records.add(yesterday);
13             records.add(lastMonth);
14             records.add(lastTwoYear);
15             
16             
17             List<Record> results =getRecordByDate(DateType.lastOneYear, records);
18 
19             for(Record record:results) {
20                 System.out.println(record.getDateString());
21             }
22             
23 
24         }
25  

 

 

测试结果:


2018年07月27日
2018年07月26日
2018年06月26日

 

posted @ 2018-07-27 20:42  小钟233  阅读(155)  评论(0编辑  收藏  举报