java关于时间比较|String转Date|Date转String|指定时间加上指定天数后的日期|当时时间加上指定天数后的日期等的方法

简介: java关于时间比较|String转Date|Date转String|指定时间加上指定天数后的日期|当时时间加上指定天数后的日期等的方法

在网上有很多这类关于时间的比较,


但是都比较杂,看着很累,我呢就提取了一些精华的部分和经常用到的一些时间比较,其中包括


1、比较前后两个时间,相差几年或几月或几日

例如2018-02-12  到2018-03-10,相差0个月


2018-02-09到2018-03-10,相差1个月

2、比较前后两个时间是否在同月

例如2018-02-12  和 2018-03-10,不是在同一个月

3、获取当前系统时间

4、日期转换成字符串

5、期转换成字符串  包含时分秒

6、字符串转换成日期

7、字符串转换成日期 包含时分秒

 

代码如下:

public class CompareDate {
    public static void main(String[] args) throws Exception{
//        int i = compareMonth("2018-03-01", null);
        int i = CompareDate.compareDate("2017-02-13", null, 1);
        System.out.println(i);
    }
    /**
     * 比较前后两个时间,相差几年或几月或几日
     * @param date1 需要比较的时间 不能为空(null),需要正确的日期格式
     * @param date2 被比较的时间  为空(null)则为当前时间
     * @param stype 返回值类型   0为多少天,1为多少个月,2为多少年
     * @return
     */
    public static int compareDate(String date1,String date2,int stype){
        int n = 0;
        String[] u = {"天","月","年"};
        String formatStyle = stype==1?"yyyy-MM-dd":"yyyy-MM-dd";
        date2 = date2==null?CompareDate.getCurrentDate():date2;
        DateFormat df = new SimpleDateFormat(formatStyle);
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        try {
            c1.setTime(df.parse(date1));
            c2.setTime(df.parse(date2));
        } catch (Exception e3) {
            System.out.println("比较时间异常");
        }
        //List list = new ArrayList();
        while (!c1.after(c2)) {                     // 循环对比,直到相等,n 就是所要的结果
            //list.add(df.format(c1.getTime()));    // 这里可以把间隔的日期存到数组中 打印出来
            n++;
            if(stype==1){
                c1.add(Calendar.MONTH, 1);          // 比较月份,月份+1
            }
            else{
                c1.add(Calendar.DATE, 1);           // 比较天数,日期+1
            }
        }
        n = n-1;
        if(stype==2){
            n = (int)n/365;
        }
        System.out.println(date1+" -- "+date2+" 相差多少"+u[stype]+":"+n);
        return n;
    }
    /**
     * 比较前后两个时间是否在同月
     * @param beginTime
     * @param endTime
     * @return
     */
    public static int compareMonth(String beginTime,String endTime){
       endTime=(endTime==null?CompareDate.getCurrentDate():endTime);
        System.out.println(endTime);
        //将String转为Date
        Date beginDate = CompareDate.StrToDate(beginTime);
        Date endDate = CompareDate.StrToDate(endTime);
        //获取前者中的月份
        Calendar beginCal = Calendar.getInstance();
        beginCal.setTime(beginDate);
        int beginMonth = beginCal.get(Calendar.MONTH)+1;
        //获取后者中的月份
        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);
        int endMonth = endCal.get(Calendar.MONTH)+1;
        return endMonth-beginMonth;
    }
    /**
     * 得到当前日期
     * @return
     */
    public static String getCurrentDate() {
        Calendar c = Calendar.getInstance();
        Date date = c.getTime();
        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
        return simple.format(date);
    }
    /**
     * 日期转换成字符串
     * @param date
     * @return str
     */
    public static String DateToStr(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String str = format.format(date);
        return str;
    }
    /**
     * 日期转换成字符串  包含时分秒
     * @param date
     * @return str
     */
    public static String DateToStrIncludeHMS(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = format.format(date);
        return str;
    }
    /**
     * 字符串转换成日期
     * @param str
     * @return
     */
    public static Date StrToDate(String str) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    /**
     * 字符串转换成日期 包含时分秒
     * @param str
     * @return date
     */
    public static Date StrToDateIncludeHMS(String str) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

2019/11/11 新增

8、指定时间加上指定天数后的日期:

比如指定时间的7天后的日期,14天后的日期等

9、当时时间加上指定天数后的日期

比如当前时间的7天后的日期,14天后的日期等

import net.sf.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * Created by yjl on 2019/11/11.
 */
public class Util {
    /**
     * 指定日期加上天数后的日期
     * @param date 时间
     * @param pattern 时间格式化的格式 eg:yyyy-MM-dd HH:mm:ss
     * @param num 为增加的天数
     * @return
     */
    public static String getTimePlusDay(String date,String pattern,int num){
        String enddate="";
        try {
            //SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            Date currdate = format.parse(date);
            System.out.println("传入的日期是:" + currdate);
            Calendar ca = Calendar.getInstance();
            ca.setTime(currdate);
            ca.add(Calendar.DATE, num);// num为增加的天数,可以改变的
            currdate = ca.getTime();
             enddate = format.format(currdate);
            System.out.println("增加天数以后的日期:" + enddate);
        }catch (Exception e){
            e.printStackTrace();
            enddate="时间格式化异常,请检查getTimePlusDay()方法";
        }
        return enddate;
    }
    //当前日期加上天数:
    /**
     * 当前日期加上天数后的日期
     * @param pattern 时间格式化的格式 eg:yyyy-MM-dd HH:mm:ss
     * @param num 为增加的天数
     * @return
     */
    public static String getCurrentTimePlusDay(String pattern,int num){
        Date d = new Date();
        //SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        String currdate = format.format(d);
        System.out.println("现在的日期是:" + currdate);
        Calendar ca = Calendar.getInstance();
        ca.add(Calendar.DATE, num);// num为增加的天数,可以改变的
        d = ca.getTime();
        String enddate = format.format(d);
        System.out.println("增加天数以后的日期:" + enddate);
        return enddate;
    }
    public static void main(String[] args) {
        //测试用例
        getTimePlusDay("201910280000","yyyyMMddHHmm",14); //输出:增加天数以后的日期:201911110000
        getTimePlusDay("2019-10-28 00:00","yyyy-MM-dd HH:mm",14); //输出:增加天数以后的日期:2019-11-11 00:00
        getCurrentTimePlusDay("yyyyMMddHHmm",14); //输出:增加天数以后的日期:201911251936
        getCurrentTimePlusDay("yyyy-MM-dd HH:mm",14); //输出:增加天数以后的日期:2019-11-25 19:36
    }
}

2019/11/27 新增

10、当前时间-传过来的时间,两者相差几分钟

/**
     * 当前时间-传过来的时间,两者相差几分钟
     * @param dataStr
     * @return
     */
    public static Long compareDate(String dataStr){
        long diff=0L;
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            long currentTime =System.currentTimeMillis();
            //从对象中拿到时间
            long createTime = df.parse(dataStr).getTime();
            diff=(currentTime-createTime)/1000/60;
            System.out.println("当前系统时间为:"+currentTime+",传过来的时间为:"+createTime+",两个时间差为:"+diff+"分钟");
        } catch (ParseException e) {
            e.printStackTrace();
            System.out.println("传过来比较的时间格式非yyyy-MM-dd HH:mm:ss格式:"+dataStr);
        }
        return diff;
    }
    public static void main(String[] args) {
        compareDate("2019-11-27 15:10:30"); //当前系统时间为:1574839173574,传过来的时间为:1574838630000,两个时间差为:9分钟
        compareDate("2019-11-27 15:30:30"); //当前系统时间为:1574839354676,传过来的时间为:1574839830000,两个时间差为:-7分钟
    }

2019/11/28 新增

11、获取上周周一时间

12、获取本周周一时间

13、获取下周周一时间

/**
     * 获取上周周一
     * @param date
     * @return
     */
    public static Date getLastWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -7);
        return cal.getTime();
    }
    public static Date getThisWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return cal.getTime();
    }
    public static Date getNextWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, 7);
        return cal.getTime();
    }
public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date date = new Date();
        String getLastWeekMonday = sdf.format(getLastWeekMonday(date)); 
        String getThisWeekMonday = sdf.format(getThisWeekMonday(date));
        String getNextWeekMonday = sdf.format(getNextWeekMonday(date));
        System.out.println("getLastWeekMonday:"+getLastWeekMonday); //getLastWeekMonday:20191118
        System.out.println("getThisWeekMonday:"+getThisWeekMonday); //getThisWeekMonday:20191125
        System.out.println("getNextWeekMonday:"+getNextWeekMonday); //getNextWeekMonday:20191202
    }

 

2020/01/07 新增

14、获取上个月的时间

/**
     * 获取上个月的时间
     * @param formatStr 格式化格式
     * @return
     */
    public static String getLastMonth(String formatStr) {
        if (formatStr == null || "".equals(formatStr)){
            formatStr = "yyyy-MM";
        }
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date); // 设置为当前时间
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); // 设置为上一个月
        date = calendar.getTime();
        String accDate = format.format(date);
        return accDate;
    }

欢迎大家测试,提出更多关于时间比较的想法,然后大家一起补充

相关文章
|
12天前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
121 4
|
12天前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
83 1
|
21天前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
76 11
|
17天前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
163 5
|
25天前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
2月前
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。
|
2月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
240 0
|
4月前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
96 0
|
7月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
166 11
|
7月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
185 9