时间操作工具类

DateUtils

package com.test.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class DateUtils {

    private static final Logger logger = LoggerFactory.getLogger(DateUtils.class);

    public static final int SECONDS_IN_DAY = 60 * 60 * 24;
    public static final long MILLIS_IN_DAY = 1000L * SECONDS_IN_DAY;

    private static long toDay(long millis) {
        return (millis + TimeZone.getDefault().getOffset(millis)) / MILLIS_IN_DAY;
    }

    /**
     * 判断两个日期是否同一天
     * 
     * @param ms1
     * @param ms2
     * @return
     */
    public static boolean isSameDay(final long ms1, final long ms2) {
        final long interval = ms1 - ms2;
        return interval < MILLIS_IN_DAY && interval > -1L * MILLIS_IN_DAY && toDay(ms1) == toDay(ms2);
    }

    /**
     * 比较两个日期的大小
     * 
     * @param d1
     * @param d2
     * @return
     */
    public static Integer compart(Date d1, Date d2) {
        if (d1 == null || d2 == null) {
            return null;
        }
        if (d1.getTime() > d2.getTime()) {
            return 1;
        } else if (d1.getTime() == d2.getTime()) {
            return 0;
        } else if (d1.getTime() < d2.getTime()) {
            return -1;
        } else {
            return null;
        }
    }

    /**
     * 获取当月第一天
     */
    public static Date getFirstDayOfMonth() {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, 0);
        c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
        // 将时分秒,毫秒域清零
        toZeroByCalendar(c);
        return c.getTime();
    }

    /**
     * 获取当月最后一天
     */
    public static Date getLastDayOfMonth() {
        Calendar ca = Calendar.getInstance();
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        // 将时分秒,毫秒域清零
        toZeroByCalendar(ca);
        return ca.getTime();
    }

    /**
     * 获取当前日期前day天
     * 
     * @param date
     * @param day
     * @return
     */
    public static Date getBeforeDay(Date date, int day) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.add(Calendar.DAY_OF_MONTH, -day);
        // 将时分秒,毫秒域清零
        toZeroByCalendar(ca);
        return ca.getTime();
    }

    /**
     * 获取当前日期后day天
     * 
     * @param date
     * @param day
     * @return
     */
    public static Date getAfterDay(Date date, int day) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.add(Calendar.DAY_OF_MONTH, day);
        // 将时分秒,毫秒域清零
        toZeroByCalendar(ca);
        return ca.getTime();
    }

    /**
     * 获取前month月的日期(month为负时往后推,month为正时往前推)
     * 
     * @param date
     * @param month
     * @return
     */
    public static Date getBeforeMonth(Date date, int month) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.add(Calendar.MONTH, -month);
        // 将时分秒,毫秒域清零
        toZeroByCalendar(ca);
        return ca.getTime();
    }

    /**
     * 获newDtae时间前points个月的每个月的第一天和最后一天
     * 
     * @param
     * @param
     * @return
     */
    public static List<Map<String, String>> getDateList(Date newDtae, Integer points) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<Map<String, String>> time = new ArrayList<Map<String, String>>();

        Map<String, String> map = new HashMap<String, String>();
        Date beforeMonth = getBeforeMonth(newDtae, 1);
        for (int i = 0; i < points; i++) {
            String firstDay = sdf.format(getFirstDayOfMonth(beforeMonth));
            String lastDay = sdf.format(getLastDayOfMonth(beforeMonth));
            beforeMonth = getBeforeMonth(beforeMonth, 1);
            map.put("startDate", firstDay);
            map.put("endDate", lastDay);
            time.add(map);
            map = new HashMap<String, String>();
        }

        return time;
    }

    /**
     * 获取当月第一天
     */
    public static Date getFirstDayOfMonth(Date newDate) {
        Calendar c = Calendar.getInstance();
        c.setTime(newDate);
        c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
        // 将时分秒,毫秒域清零
        toZeroByCalendar(c);
        return c.getTime();
    }

    /**
     * 获取当月最后一天
     */
    public static Date getLastDayOfMonth(Date newDate) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(newDate);
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        // 将时分秒,毫秒域清零
        toZeroByCalendar(ca);
        return ca.getTime();
    }

    public static String getNowTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date());
    }

    public static String formatDate(Date d) {
    	if (d != null) {
    		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            String date = formatter.format(d);
            return date;
    	}
    	return null;
    }

    public static Date formatDate(String d) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = formatter.parse(d);
        } catch (ParseException e) {
            logger.error(e.getMessage(), e);
        }
        return date;
    }
    
    public static Date formatDateTime(String d) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = formatter.parse(d);
        } catch (ParseException e) {
            logger.error(e.getMessage(), e);
        }
        return date;
    }

    public static Date getNowTimeAndHoursMinutesSecondsToZero() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        // 将时分秒,毫秒域清零
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /**
     * 获取指定日期的日
     * 
     * @param date
     * @return
     */
    public static int getDay(Date date) {
        Calendar now = Calendar.getInstance();
        now.setTime(date);
        int day = now.get(Calendar.DAY_OF_MONTH);
        return day;
    }

    /**
     * 获取配置信息中对账日、付款日可用日
     * 
     * @return
     */
    public static List<String> getUsableDays() {
        List<String> resultList = new ArrayList<String>();
        String usableDays = ConfigUtils.getConfig("customer.usable.days");// 获取配置信息中配置的可用日
        String usableDaysAry[] = usableDays.split(",");
        for (int i = 0; i < usableDaysAry.length; i++) {
            resultList.add(usableDaysAry[i]);
        }
        return resultList;
    }

    private static void toZeroByCalendar(Calendar c) {
        // 将时分秒,毫秒域清零
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        return;
    }

    public static Date setTimeHMSToZero(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        toZeroByCalendar(calendar);
        return calendar.getTime();
    }

    /**
     * 获取查询时间的points个时间区间
     * 
     * @param startDate
     * @param endDate
     * @return
     */
    public static List<Map<String, String>> getDateList(String startDate, String endDate, Integer points) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<Map<String, String>> time = new ArrayList<Map<String, String>>();
        try {
            Long dayTime = sdf.parse(endDate).getTime() - sdf.parse(startDate).getTime();

            int day = (int) (dayTime / (3600 * 24 * 1000)) + 1;
            Map<String, String> map = new HashMap<String, String>();
            for (int i = 0; i < points; i++) {
                map.put("startDate", startDate);
                map.put("endDate", endDate);
                time.add(map);
                map = new HashMap<String, String>();
                endDate = sdf.format(DateUtils.getBeforeDay(sdf.parse(startDate), 1));
                startDate = sdf.format(DateUtils.getBeforeDay(sdf.parse(startDate), day));
            }
        } catch (ParseException e) {
            logger.warn("日期处理异常" + e.getMessage());
        }
        return time;
    }

    /**
     * 两个日期相减获取天数
     * 
     * @param startDate
     * @param endDate
     * @return
     */
    public static int getDateSubtract(Date startDate, Date endDate) {
        return (int) ((endDate.getTime() - startDate.getTime()) / (24 * 3600 * 1000));
    }

    /**
     * 判断传入日期为周几
     * 
     * @param date
     * @param weekEnum
     * @return
     */
    public static boolean checkIsWeekDay(Date date, int weekEnum) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        if (calendar.get(Calendar.DAY_OF_WEEK) == weekEnum) {
            return true;
        }
        return false;
    }

    /**
     * 获取指定日月的天数
     * 
     * @param date
     * @return
     */
    public static int getCurrMonthDayNum(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 日期克隆.
     * 
     * @param date
     *            日期
     * @return 克隆后的日期
     */
    public static Date dateClone(Date date) {
        if (date != null) {
            return (Date) date.clone();
        } else {
            return null;
        }
    }

    /**
     * 获取当前时间10分钟后的时间
     * 
     * @return
     */
    public static String getDateYmdHms10MS() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        Date afterDate = new Date(now.getTime() + 600000);
        String date = formatter.format(afterDate);
        return date;
    }

    /**
     * 获取指定格式的日期时间(yyyyMMddHHmmss)
     * 
     * @return
     */
    public static String getDateYmdHms() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        String date = formatter.format(new Date());
        return date;
    }

    /**
     * 获取当前时间10分钟后的时间的指定格式的日期时间(yyyyMMddHHmmss)
     * 
     * @return
     */
    public static String getDateYmdHms10M() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        Date now = new Date();
        Date afterDate = new Date(now.getTime() + 600000);
        String date = formatter.format(afterDate);
        return date;
    }

    /**
     * 获取0点的时刻.
     * 
     * @param date
     *            时间
     * @return 0点时刻
     */
    public static Date getDateInZeroMiliSecond(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 00);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }
    
    /**
	 * 获取指定日期的年
	 * 
	 * @param date
	 * @return
	 */
	public static int getYear(Date date) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(date);
		int year = ca.get(Calendar.YEAR);
		return year;
	}

	/**
	 * 获取指定日期的月
	 * 
	 * @param date
	 * @return
	 */
	public static int getMonth(Date date) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(date);
		int month = ca.get(Calendar.MONTH) + 1;
		return month;
	}

    /**
     * 判断两个日期相差月数.
     *
     * @param sourceDate
     *            开始日期
     * @param compareDate
     *            比较日期
     * @return 相差月数
     */
    public static int disparityMonth(Date sourceDate, Date compareDate) {
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(sourceDate);
        c2.setTime(compareDate);
        return (c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH)) + (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值