1. 程式人生 > >Java 日期時間工具類(持續更新)

Java 日期時間工具類(持續更新)

package cn.eshifu.eby.comm.util;


import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Interval;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class TimeUtil {

    public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
    public static DateTimeFormatter FMT = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.s");
    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    // 2017-08-09 上午/下午
    public static final String YYYY_MM_DD_A = "yyyy-MM-dd a";
    public static final String YYYY_MM_DD = "yyyy-MM-dd";

    public static SimpleDateFormat YYYY_MM = new SimpleDateFormat("yyyy-MM");
    public static SimpleDateFormat YYYY = new SimpleDateFormat("yyyy");

    public static String getCurrentYear(){
        return YYYY.format(new Date());
    }

    /**
     *
     * @param planTime
     * @return
     */
    public static String getMonthFirstDay(String planTime) {
        try {
            Calendar calendar = Calendar.getInstance();
            if (!StringUtils.isEmpty(planTime)) {
                Date planTime1 = sdf1.parse(planTime);
                calendar.setTime(planTime1);
            }
            calendar.set(Calendar.DAY_OF_MONTH,
                    calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return sdf.format(calendar.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     *
     * @param planTime
     * @return
     */
    public static String getMonthLastDay(String planTime) {
        try {
            Calendar calendar = Calendar.getInstance();
            if (!StringUtils.isEmpty(planTime)) {
                Date planTime1 = sdf1.parse(planTime);
                calendar.setTime(planTime1);
            }
            calendar.set(Calendar.DAY_OF_MONTH,
                    calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            calendar.set(Calendar.MILLISECOND, 999);
            return sdf.format(calendar.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 得到轉換後的日期格式
     */
    public static String getFormatTime(Date time) {
        if (time == null) {
            return "";
        }
        return sdf.format(time);
    }

    //得到轉換後的日期格式
    public static String getFormatPlanTime(Date time) {
        if (time == null) {
            return " ";
        }
        return sdf1.format(time);
    }

    //獲取當天的起始時間
    public static Date getStartTime() {
        Calendar todayStart = Calendar.getInstance();
        todayStart.set(Calendar.HOUR_OF_DAY, 0);
        todayStart.set(Calendar.MINUTE, 0);
        todayStart.set(Calendar.SECOND, 0);
        todayStart.set(Calendar.MILLISECOND, 0);
        return todayStart.getTime();
    }

    public static Date getEndTime() {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 59);
        todayEnd.set(Calendar.MILLISECOND, 999);
        return todayEnd.getTime();
    }

    //獲取昨天天的起始時間
    public static Date getLastDayStartTime() {
        Calendar todayStart = Calendar.getInstance();
        todayStart.add(Calendar.DATE, -1);
        todayStart.set(Calendar.HOUR, 0);
        todayStart.set(Calendar.MINUTE, 0);
        todayStart.set(Calendar.SECOND, 0);
        todayStart.set(Calendar.MILLISECOND, 0);
        return todayStart.getTime();
    }

    public static Date getLastDayEndTime() {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.add(Calendar.DATE, -1);
        todayEnd.set(Calendar.HOUR, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 59);
        todayEnd.set(Calendar.MILLISECOND, 999);
        return todayEnd.getTime();
    }

    public static boolean greaterEqualEvlent(String time) {
        try {
            Calendar todayStart = Calendar.getInstance();
            todayStart.set(Calendar.HOUR_OF_DAY, 11);
            todayStart.set(Calendar.MINUTE, 40);
            todayStart.set(Calendar.SECOND, 0);
            todayStart.set(Calendar.MILLISECOND, 0);
            Date time1 = sdf.parse(time);
            if (time1.getTime() < todayStart.getTime().getTime()) {
                return true;
            } else {
                return false;
            }
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 判斷時間是否在時間段內
     *
     * @param nowTime
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);
        Calendar begin = Calendar.getInstance();
        begin.setTime(beginTime);
        Calendar end = Calendar.getInstance();
        end.setTime(endTime);
        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }


    /**
     * 判斷輸入日期是否當天日期
     *
     * @param current
     * @return
     */
    public static boolean isToday(Date current) {
        DateTime begin = new DateTime().withTime(0, 0, 0, 0);
        DateTime end = new DateTime().withTime(23, 59, 59, 999);
        Interval interval = new Interval(begin, end);
        return interval.contains(current.getTime());
    }

    /**
     * 判斷輸入日期是否今天和昨天的日期
     *
     * @param current
     * @return
     */
    public static boolean isTodayAndYesterday(Date current) {
        DateTime begin = new DateTime().withTime(0, 0, 0, 0).minusDays(1);
        DateTime end = new DateTime().withTime(23, 59, 59, 999);
        Interval interval = new Interval(begin, end);
        return interval.contains(current.getTime());
    }

    /**
     * 轉換不同型別的日期格式
     *
     * @param to
     * @param from
     * @param target
     * @return
     */
    public static String transferFormat(String target, String from, String to) {
        try {
            SimpleDateFormat fromFormat = new SimpleDateFormat(from);
            Date targetDate = fromFormat.parse(target);
            return new SimpleDateFormat(to).format(targetDate);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根據日期區間轉換成步長為1的遞增陣列
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> turnToArrayBetweenDate(Date start, Date end) {
        List<String> result = Lists.newArrayList();
        int days = Days.daysBetween(new DateTime(start), new DateTime(end)).getDays();
        if (days < 1) {
            return result;
        }
        int i = 0;
        do {
            result.add(new DateTime(start).plusDays(i).toString(YYYY_MM_DD));
            i++;
        } while (days >= i);
        return result;
    }

    /**
     * 獲取當前時間戳(秒)
     */
    public static long getCurrentTimeStampSecond() {
        return System.currentTimeMillis() / 1000;
    }

    /**
     * 獲取指定年份日曆
     * @param year
     * @return
     */
    private static Calendar getCalendarFormYear(int year){
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.set(Calendar.YEAR, year);
        return cal;
    }
    /**
     * 獲取指定年指定周的開始日期
     * @param year
     * @param weekNo
     * @return
     */
    public static String getStartDayOfWeekNo(int year,int weekNo){
        Calendar cal = getCalendarFormYear(year);
        cal.set(Calendar.WEEK_OF_YEAR, weekNo);
        int month = cal.get(Calendar.MONTH) + 1;
        int day = cal.get(Calendar.DAY_OF_MONTH);
        String monthStr = null;
        String dayStr = null;
        StringBuilder monthBuilder = new StringBuilder();
        StringBuilder dayBuilder = new StringBuilder();
        if(month < 10){
            monthStr = monthBuilder.append("0").append(month).toString();
        } else {
            monthStr = monthBuilder.append(month).toString();
        }
        if(day < 10) {
            dayStr = dayBuilder.append("0").append(day).toString();
        } else {
            dayStr = dayBuilder.append(day).toString();
        }
        return cal.get(Calendar.YEAR) + "-" + monthStr + "-" + dayStr;

    }

    /**
     * 獲取指定年指定周的結束日期
     * @param year
     * @param weekNo
     * @return
     */
    public static String getEndDayOfWeekNo(int year,int weekNo){
        Calendar cal = getCalendarFormYear(year);
        cal.set(Calendar.WEEK_OF_YEAR, weekNo);
        cal.add(Calendar.DAY_OF_WEEK, 6);
        int month = cal.get(Calendar.MONTH) + 1;
        int day = cal.get(Calendar.DAY_OF_MONTH);
        String monthStr = null;
        String dayStr = null;
        StringBuilder monthBuilder = new StringBuilder();
        StringBuilder dayBuilder = new StringBuilder();
        if(month < 10){
            monthStr = monthBuilder.append("0").append(month).toString();
        } else {
            monthStr = monthBuilder.append(month).toString();
        }
        if(day < 10) {
            dayStr = dayBuilder.append("0").append(day).toString();
        } else {
            dayStr = dayBuilder.append(day).toString();
        }
        return cal.get(Calendar.YEAR) + "-" + monthStr + "-" +  dayStr;
    }


    //獲取 某日是某年的第幾周
    public static int getWeekByDay(String day) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.SUNDAY);
        calendar.setTime(format.parse(day));
        return calendar.get(Calendar.WEEK_OF_YEAR);
    }

    //獲取 指定開始日期和結束日期,包含日期列表。
    public static List<String> getDays(String beginDate, String endDate) throws ParseException {
        List<String> result = Lists.newArrayList();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf1.parse(beginDate));
        for (long  time= calendar.getTimeInMillis(); time <= sdf1.parse(endDate).getTime(); time = getNextDay(calendar)) {
            result.add(sdf1.format(time));
        }
        return result;
    }

    public static long getNextDay(Calendar calendar) {
        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
        return calendar.getTimeInMillis();
    }

    /**
     * 得到某一天是這一年的第幾周
     * @param date
     * @return
     */
    public static int getWeek(String date) {
        Calendar cal = Calendar.getInstance();
        try {
            cal.setTime(sdf1.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int week = cal.get(Calendar.WEEK_OF_YEAR);
        return week;
    }

    /**
     * 獲取周區間
     * @param start yyyy-MM-dd
     * @param end yyyy-MM-dd
     * @return
     */
    public static List<String> findWeeks(String start,String end){
        int days = Days.daysBetween(new DateTime(start), new DateTime(end)).getDays();
        if (days < 1) {
            return Lists.newArrayList();
        }
        int i = 0;
        Set<Integer> sets = Sets.newHashSet();
        do {
            int week = getWeek(new DateTime(start).plusDays(i).toString(YYYY_MM_DD));
            sets.add(week);
            i++;
        } while (days >= i);
        return sets.stream().sorted().map(num -> String.valueOf(num)).collect(Collectors.toList());
    }

    public static List<String> findMonths(String start,String end) throws ParseException {
        List<String> list = Lists.newArrayList();
        Date d1 = sdf1.parse(start);//定義起始日期
        Date d2 = sdf1.parse(end);//定義結束日期
        Calendar dd = Calendar.getInstance();//定義日期例項
        dd.setTime(d1);//設定日期起始時間
        while (dd.getTime().before(d2)) {//判斷是否到結束日期
            list.add(YYYY_MM.format(dd.getTime()));
            dd.add(Calendar.MONTH, 1);//進行當前日期月份加1
        }
        return list;
    }


    public static void main(String[] args) throws ParseException {

        List<String> weeks = findWeeks("2018-05-04", "2018-09-20");
        System.out.println(weeks);


//        for(int i =1 ; i< 10; i++){
//            int week = getWeek("2018-09-0" + i);
//            System.out.println(week);
//        }
//        String startDayOfWeekNo = getStartDayOfWeekNo(2018, 35);
//        System.out.println(startDayOfWeekNo);
//        String endDayOfWeekNo = getEndDayOfWeekNo(2018, 35);
//        System.out.println(endDayOfWeekNo);

        String start = "2018-07-08";
        String end = "2018-09-30";
//        List<String> months = findMonths(start, end);
//        System.out.println(months);

//        System.out.println(new Timestamp(sdf1.parse(start).getTime()));
//        System.out.println(new Timestamp(sdf.parse(end + " 23:59:59").getTime()));

//        String lastDay = getMonthLastDay(start);
//        System.out.println(lastDay);

    }
}