Java中对两个日期时间的比较方法


在Java中比较时间或者日期基本上都要转换成Date类型,本文主要提供三个方法,compareTo、getTime、after;另外还提供计算两天之间的天数,以及根据当前天获取后一天的日期的方法。

package com.raipeng.test;

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

public class TestTime {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String firstTime = "2015-01-07 08:52";
		String secondTime = "2015-01-07 11:53";
		CompareDateTime(firstTime, secondTime);

		String thirdTime = "2015-01-07 08:52";
		String fourthTime = "2015-01-07 12:53";
		CompareDateTime(thirdTime, fourthTime);

		String fifthTime = "2015-01-07 08:52";
		String sixthTime = "2015-01-07 13:53";
		CompareDateTime(fifthTime, sixthTime);

		String date1 = "2014-12-03";
		String date2 = "2015-01-07";
		System.out.println("天数=="+daysBetween(date1, date2));
		System.out.println("后一天=="+getSpecifiedDayAfter(date1));

	}

	public static boolean CompareDateTime(String time1, String time2) {
		boolean isFirstBig = false;
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		try {
			Date date1 = dateFormat.parse(time1);
			Date date2 = dateFormat.parse(time2);
			System.out.println("date1==" +date1.getTime());
			System.out.println("date2==" +date2.getTime());
			// Method 1
			if (date1.getTime() > date2.getTime()) {
				System.out.println("M1--date1在date2后");
				isFirstBig = true;
			} else if (date1.getTime() < date2.getTime()) {
				System.out.println("M1--date1在date2前");
				isFirstBig = false;
			}
			// Method 2
			if (date1.compareTo(date2) == 1) {
				System.out.println("M2--date1在date2后");
				isFirstBig = true;
			} else if (date1.getTime() < date2.getTime()) {
				System.out.println("M2--date1在date2前");
				isFirstBig = false;
			}
			// Method 3
			Calendar cal1 = Calendar.getInstance();
			Calendar cal2 = Calendar.getInstance();
			cal1.setTime(date1);
			cal2.setTime(date2);
			if (cal1.after(cal2)) {
				System.out.println("M3--date1在date2后");
			} else {
				System.out.println("M3--date1在date2前");
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return isFirstBig;
	}

	/**
	 * 计算两天之间的天数
	 * @param startStr
	 * @param endStr
	 * @return
	 */
	public static int daysBetween(String startStr, String endStr) {
		int daysBetween = 0;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

			Date date1 = sdf.parse(startStr);
			Calendar startDate = Calendar.getInstance();
			startDate.setTime(date1);

			Date date2 = sdf.parse(endStr);
			Calendar endDate = Calendar.getInstance();
			endDate.setTime(date2);

			Calendar date = (Calendar) startDate.clone();

			while (date.before(endDate)) {
				date.add(Calendar.DAY_OF_MONTH, 1);
				daysBetween++;
			}

		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return daysBetween;
	}
	/**
     * 获得指定日期的后一天
     *
     * @param specifiedDay
     * @return
     */
    public static String getSpecifiedDayAfter(String specifiedDay) {
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + 1);  

        String dayAfter = new SimpleDateFormat("yyyy-MM-dd")
                .format(c.getTime());
        return dayAfter;
    }
}

代码虽然简单,但粗心大意的我却在这上面耗费了近半天的时间

问题描述:如上,有三组时间对,其中第二组的第二个时间为12点多,在没改之前,只有这组的返回结果是错误的,调试半天找不到原因,后来有网友建议把gettime的值打印出来看看,打出来后发现12点多返回的long值确实比其他几个都小很多,然后把年月日去掉直接比较时间还是同样的结果,然后就突然意识到可能是“时”这个单位的问题,然后就看到了这行代码

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");

下意识的将这行代码改为

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");

看到区别只在于h的大小写,然后运行结果就正确了

然后在博客园看到这样一篇文章 点击打开链接

{0:yyyy-MM-dd HH:mm:ss.fff}:使用24小时制格式化日期

{0:yyyy-MM-dd hh:mm:ss.fff}:使用12小时制格式化日期

原来就是24小时制和12小时制格式的区别,所以大家以后要注意了

同理还有这个Calendar.HOUR_OF_DAY和Calendar.HOUR_OF_DAY,前者是24小时,后者是12小时

上面java代码运行后控制台输出如下:

时间: 2024-11-01 12:26:06

Java中对两个日期时间的比较方法的相关文章

java中计算两个日期之间天数的程序设计。

1 //用java编写出一个以下方法计算两个日期之间天数的程序设计. 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 public class Demo4 { 7 public static void main(String[] args) { 8 try { 9 System.out.println(相差天数("2016-11-30", "2016-5-31"));

Oracle中计算两个日期时间的差

--方法1 select floor((sysdate - to_date('2006-09-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss'))) as sDays from dual; --ceil(n) 取大于等于数值n的最小整数; --floor(n)取小于等于数值n的最大整数; select ceil(9.6) from dual; --->10 select floor(9.6) from dual; --->9 --方法2 select ROUND(TO

Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总结 0.前言 通过前面Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中主要的类关系简图如下: 可以看出主要的LocalDate, LocalTime, LocalDateTime, Instant都是实现相同的接口,这里以LocalDate为例分析jav

Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用java新的日期时间API重写农历LunarDate. package com.xkzhangsan.time; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import ja

Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date

从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date.下面是时间类互相转换大全,包含Instant.LocalDate.LocalDateTime.LocalTime和Date的相互转换,下面是一个工具类,仅供参考: package com.xkzhangsan.time.converter; import java.time.Instant;

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

Java日期时间API系列20-----Jdk8中java.time包中的新的日期时间API类,ZoneId时区ID大全等。

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等.中已经对ZoneId说明,并列出了常用时区ID信息. 并且通过 java.time.ZoneId.getAvailableZoneIds()获取到所有可用时区ID. 1.测试代码 /** * 获取可用时区ID */ @Test public void getAvailableZon

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneId. ZonedDateTime是用来处理时区相关的时间,它的各种计算都离不开ZoneId.先看ZoneId. 1. ZoneId 为时区ID,比如Europe/Paris,表示欧洲巴黎时区 1.1 时区相关知识,时区,UTC时间,GMT时间,Unix时间戳 时区 地球自西向东旋转,东边比西边先看到

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差.其结果的单位由interval 参数给出.interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同. mysql> SELECT TIMESTAMPDIFF(MONTH,'200