JAVA造轮子之-日期工具类

Java常用日期工具类,常规的日期、时间格式转换,字符串转Date对象,Date对象转字符串,日期比较,日期添加指定年、月、天等,计算两个日期之间相差的天数、月数、年数等;

DateUtils.java

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

/**
 * @author JL
 * @version V1.0
 * @Description 用java.util.Calendar封装日期、时间操作工具类
 */
public class DateUtils {

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String HH_MM_SS = "HH:mm:ss";

    public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    public static final String YYYYMMDD = "yyyyMMdd";
    public static final String HHMMSS = "HHmmss";

    public static String getTimeStr(Date date, String pattern){
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    public static String getTimeStr(String pattern){
        return getTimeStr(new Date(), pattern);
    }

    public static String getTimeStr(Date date){
        return getTimeStr(date, YYYY_MM_DD_HH_MM_SS);
    }

    public static String getTimeStr(){
        return getTimeStr(new Date(), YYYY_MM_DD_HH_MM_SS);
    }

    public static String getDateStr(Date date){
        return getTimeStr(date, YYYY_MM_DD);
    }

    public static String getDateStr(){
        return getTimeStr(new Date(), YYYY_MM_DD);
    }

    public static Long getTimeToLong(){
        return Long.parseLong(getTimeStr(new Date(), YYYYMMDDHHMMSS));
    }

    public static Long getTimeToLong(String timeStr){
        timeStr = timeStr.replaceAll("-","");
        timeStr = timeStr.replaceAll("/","");
        timeStr = timeStr.replaceAll(" ","");
        timeStr = timeStr.replaceAll(":","");
        return Long.parseLong(timeStr);
    }

    public static Long getTimeToLong(Date date){
        return Long.parseLong(getTimeStr(date, YYYYMMDDHHMMSS));
    }

    public static Date getTime(String timeStr, String pattern){
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try{
            return sdf.parse(timeStr);
        }catch(ParseException pe){
            System.out.println("时间格式不对:" + pe.getMessage());
        }
        return null;
    }

    public static Date getTime(String timeStr){
        return getTime(timeStr, YYYY_MM_DD_HH_MM_SS);//默认YYYY_MM_DD_HH_MM_SS
    }

    public static Date getDate(String dateStr){
        return getTime(dateStr, YYYY_MM_DD);//默认YYYY_MM_DD
    }

    public static int getYear(){
        return Calendar.getInstance().get(Calendar.YEAR);
    }

    public static int getMonth(){
        return Calendar.getInstance().get(Calendar.MONTH) + 1;
    }

    public static int getDay(){
        return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
    }

    public static Date addDayDate(int amount){
        return addTimeDate(Calendar.DAY_OF_MONTH, amount);
    }

    public static int addDay(int amount){
        return addTime(Calendar.DAY_OF_MONTH, amount);
    }

    public static Date addMonthDate(int amount){
        return addTimeDate(Calendar.MONTH, amount);
    }

    public static int addMonth(int amount){
        return addTime(Calendar.MONTH, amount);
    }

    public static Date addYearDate(int amount){
        return addTimeDate(Calendar.YEAR, amount);
    }

    public static int addYear(int amount){
        return addTime(Calendar.YEAR, amount);
    }

    public static Date addMillisecondDate(long amout){
        return new Date(addMillisecond(amout));
    }

    public static long addMillisecond(long amout){
        return new Date().getTime() + amout;
    }

    //按不同的单位,添加时间值,返回添加后的时间值
    public static int addTime(int field, int amount){
        Calendar calendar = Calendar.getInstance();
        calendar.add(field, amount);
        return calendar.get(field);
    }

    //按不同的单位,添加时间值,返回date对象
    public static Date addTimeDate(int field, int amount){
        Calendar calendar = Calendar.getInstance();
        calendar.add(field, amount);
        return calendar.getTime();
    }

    //相差年数(按月数统计,如果不按月数统计,直接取年份相减即可)
    public static int differYear(Date date1, Date date2){
        int dMonth = differMonth(date1, date2);
        return dMonth > 0 ? dMonth / 12 : 0;
    }

    //相差月数(精确到天)
    public static int differMonth(Date date1, Date date2){
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        //年相减 * 12 + 月相减
        int year = calendar1.get(Calendar.YEAR) - calendar2.get(Calendar.YEAR);
        int month = calendar1.get(Calendar.MONTH) - calendar2.get(Calendar.MONTH);
        int day = calendar1.get(Calendar.DAY_OF_MONTH) - calendar2.get(Calendar.DAY_OF_MONTH);
        //按自然天推算,如:本月25号,到下月5号,只相差10天(按30天计算),不足一个月,需要减一个月
        //大于1,是因为按天,一个月从1号到30号算一个完整月,到下个月1号,已经多了一天
        //说明,day2在day1的前面2天,相差的天数,不足一个月,如:本月25号到下月24号为一个完整自然月;
        if (day > 1){
            return year * 12 + month - 1;
        }
        return year * 12 + month;
    }

    //相差天数
    public static long differDay(Date date1, Date date2){
        long time = date1.getTime() - date2.getTime();
        return time / (1000*60*60*24);
    }

    //是否同一天,不管时分秒
    public static boolean isSameDay(Date date1, Date date2){
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        return cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
    }

    //是否同一天,毫秒级
    public static boolean isSameInstant(Date date1, Date date2){
        return date1.getTime() == date2.getTime();
    }

    //一周中的第几天,默认从周日(0)开始计算
    public static int getWeek(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.DAY_OF_WEEK);
    }

    //一年中的第几个季度
    public static int getSeason(Date date) {
        int season = 1;
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int month = c.get(Calendar.MONTH);
        switch (month) {
            case Calendar.JANUARY:
            case Calendar.FEBRUARY:
            case Calendar.MARCH:
                season = 1;
                break;
            case Calendar.APRIL:
            case Calendar.MAY:
            case Calendar.JUNE:
                season = 2;
                break;
            case Calendar.JULY:
            case Calendar.AUGUST:
            case Calendar.SEPTEMBER:
                season = 3;
                break;
            case Calendar.OCTOBER:
            case Calendar.NOVEMBER:
            case Calendar.DECEMBER:
                season = 4;
                break;
        }
        return season;
    }

    public static void main(String[] args) {
        System.out.println(getYear()+"\t"+getMonth()+"\t"+getDay());
        System.out.println(getTimeToLong());
        System.out.println(getTimeToLong("2019-01-12 22:10:01"));
        System.out.println(getTimeToLong("2019/01/12 22:10:01"));
        System.out.println(getTimeToLong(new Date()));
        System.out.println(getTimeStr(new Date(),HH_MM_SS));
        System.out.println(addDay(-13));
        System.out.println(addMillisecond(15000));
        System.out.println(getTimeStr(addDayDate(-5)));
        System.out.println(differDay(getTime("2019-06-25 20:00:00"), getTime("2019-06-20 21:59:59")));
        System.out.println(differYear(getTime("2019-06-25 20:00:00"), getTime("2017-06-26 21:59:59")));
        System.out.println(getWeek(new Date()));
    }

}

说明:

做过项目的人都知道,很多写过的可重复利用的代码块或有用的工具类没有怎么整理,当需要的时候,又得打开项目查找一翻,虽然功能开发不难,但是又得花时间成本去写去测试,这样的重复造轮子的事情太多次了;因此不如把轮子保留,供大家一起使用;

1.这个轮子可以有:需要使用的时候确实还不存在这个组件。
2.我需要的时候轮子不在:每一种技术或工具产生都有它的项目背景,当代码写在项目里的时候,我知道有这个东西,当换了一个项目或公司后,没有备份也没有记录,这个时候你不在了,又得花时间手打一遍;
3.我不知道是不是造轮子:大多数情况下初学者很难分清楚自己是不是在重复造轮子,事实上造轮子不是我目的。我的目的是完成工作任务,任务完成的速度越快越好,质量越高越好。而不是去判断自己在不在造轮子。
4.不想重复花时间造轮子:有时候还会碰到一些并不困难但是很占时间的东西,当然有现成的轮子是花时间最少的;
5.我就是想学习轮子:初学者的并不是在重复造轮子,而是学习后以提高为自己的知识与技能。

轮子有过测试,但难免有失误,如有错误处,还敬请指出;

转载于:https://my.oschina.net/u/437309/blog/3066640

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值