1. 程式人生 > >比較兩個java.util.Date 的日期(年月日)是否相同(忽略時、分、秒)的多種方法

比較兩個java.util.Date 的日期(年月日)是否相同(忽略時、分、秒)的多種方法

    介紹幾種比較Date年月日的方法

1、需求:

1)下面兩個時間進行比較:

Thu Jan 01 08:59:00 CST 1970
Thu Jan 01 08:48:00 CST 1970

=》比較結果:same

2)下面兩個時間進行比較:

Thu Jan 01 08:00:00 CST 1970

Fri Jan 01 08:00:00 CST 2016

=>比較結果:diff

2、比較方法

這裡就直接上程式碼了~列了五種只比較年月日,忽略時分秒的日期比較方式,以及各種方法的效能比較:

method 1:

	public static boolean sameDate(Date d1, Date d2) {
		if(null == d1 || null == d2)
			return false;
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(d1);
		cal1.set(Calendar.HOUR_OF_DAY, 0);
		cal1.set(Calendar.MINUTE, 0);
		cal1.set(Calendar.SECOND, 0);
		cal1.set(Calendar.MILLISECOND, 0);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(d2);
		cal2.set(Calendar.HOUR_OF_DAY, 0);
		cal2.set(Calendar.MINUTE, 0);
		cal2.set(Calendar.SECOND, 0);
		cal2.set(Calendar.MILLISECOND, 0);
		return  cal1.getTime().equals(cal2.getTime());
	}

method 2:
	public static boolean sameDate(Date d1, Date d2){
		SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
		//fmt.setTimeZone(new TimeZone()); // 如果需要設定時間區域,可以在這裡設定
		return fmt.format(d1).equals(fmt.format(d2));
	}

method 3:
import org.apache.commons.lang.time.DateUtils;
public static boolean sameDate(Date d1, Date d2){		
   DateUtils.isSameDay(date1, date2);
 }
DateUtils提供的方法原始碼如下:
	public static boolean sameDate(Date d1, Date d2) {
		if(null == d1 || null == d2)
			return false;
		//return getOnlyDate(d1).equals(getOnlyDate(d2));
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(d1);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(d2);
		return  cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
	}

其實上面的方法就是直接獲取並比較了Calendar物件的紀元、年份和所在年份的第幾天,這樣來比較日期會比上面兩種方法快。

method 4:

import org.joda.time.LocalDate;
import org.joda.time.DateTime;

	public static Boolean sameDate(Date dt1 , Date dt2 )
	{
		LocalDate ld1 = new LocalDate(new DateTime(dt1));
		LocalDate ld2 = new LocalDate(new DateTime(dt2));
		return ld1.equals( ld2 );
	}

如果是Maven,需要新增下面的依賴:

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.2</version>
        </dependency>
method 5:

這個是Java8中java.time提供的方法

    private static boolean sameDate(Date d1, Date d2) {
        LocalDate localDate1 = ZonedDateTime.ofInstant(d1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate localDate2 = ZonedDateTime.ofInstant(d2.toInstant(), ZoneId.systemDefault()).toLocalDate();
        return localDate1.isEqual(localDate2);
    }

    通過效能比較,method 4和method 5的速度較其他幾種方法顯著提升,其中method 4較method 5快一點點,method 2最慢。

    所以如果程式中需要多次比較日期的話,建議用method 4和5。


相關推薦

比較java.util.Date日期年月日是否相同忽略多種方法

    介紹幾種比較Date年月日的方法 1、需求: 1)下面兩個時間進行比較: Thu Jan 01 08:59:00 CST 1970 Thu Jan 01 08:48:00 CST 1970 =》比較結果:same 2)下面兩個時間進行比較: Thu Jan

java.util.Date日期類通過java語句轉換成Sql(這裡測試用的是oracle)語句可直接插入如:insert into日期型別

public void add(Emp emp) throws Exception{ QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource()); String sql = "insert

js根據當前時間和結束時間做倒計時還有XXX天XXXXXXXXX

js根據當前時間和結束時間做倒計時(還有XXX天XXX時XXX分XXX秒),當天,不需要XXX天數,剩餘0小時,不需要顯示XXX時,剩餘0分鐘,不需要顯示XXX分 1. js方法 2. HTML程式碼 1. js方法 /*

時間轉時間字串x天xxx

前言 通常為了直觀表現時間會把時間數字轉成時間字串 eg: 輸入時間(秒):123456 輸出時間字串:1天10小時17分鐘36秒 直接上程式碼 public class NumToDateString { public static void main

java實現計算日期相差多少月比較日期大小 等常用日期操作

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

JAVA 比較日期相差的天數,隔天計算

JAVA 比較兩個日期相差的天數 在工作中我們經常遇到需要計算兩個日期相差的天數的問題,一個是通過得到兩個日期之間的毫秒數,換算成天數得到究竟差了多少天.但是這種問題會出現隔天問題,既: 2017.11.16 4:35 到 2017.11.17 3:35

如何用java比較間或日期的大小

有一個字串的時間,比如"2012-12-31 16:18:36" 與另一個時間做比較,如果前者比後者早,則返回true,否則返回false。 為此,我設計了一個方法。 import java.uti

java 比較日期大小日期型別和字元型別

/** * 比較兩個日期之間的大小 * * @param d1 * @param d2 * @return 前者大於後者返回true 反之false */ public static b

java比較字串完全不同處高亮顯示過濾了某些字串前面不不相干字元

java比較兩個字串完全不同處高亮顯示(過濾了某些字串前面不相干字元) 歡迎各位使用並優化,因為我也不太清楚這裡面是不是有嚴重的問題,後期我會再度優化的,寫這個東西主要是因為在網上很難找到類似的東西= =。 再說一句,請各位大佬帶我飛好嘛!!畢竟我是個小碼農

NSDate的使用方法及步驟比較日期的前後

NSDate這個類接觸的時候很像Java中Date,所以很多方法似乎都是一樣,只是名字不同而已。 下面是幾個典型時間操作: 1、系統時間按照設定的格式以字串形式輸出: // 建立一個時間物件 NSDate *date = [NSDated

JAVA 比較日期相差的天數

在測試工作中經常會使用到比較兩個日期相差的天數,我之前用過實現這一功能的兩個版本的方法,原始碼如下: 版本一:public static int getIntervalDays(Date fDate, Date oDate) { if (null == fDa

shell腳本學習2比較數字大小

$1 num centos7 錯誤 you equal shel 腳本 語句 註意:shell中對比字符串只能使用==、<、>、!=、-z、-n。對比字符串時,末尾一定要加上x(或者a、b等)一個字符,因為if [ $1x == "ab"x ]時如果沒有了x

C#代碼中如何比較日期的大小?

inf div return 比較 action tco date string 技術 C#中比較兩個日期大小的方法 /// <summary> /// 比較兩個日期大小 /// </summary>

比較物件是否相等比較

function isObjEqual (o1, o2) { var props1 = Object.getOwnPropertyNames(o1); var props2 = Object.getOwnPropertyNames(o2); if (props1.length !

java 比較物件屬性值變化情況,用於記錄日誌使用

package com.cdc.console.controller; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; public cl

js-比較日期的大小

第一種方法: function CompareDate(d1,d2) { return ((new Date(d1.replace(/-/g,"\/"))) > (new Date(d2.replace(/-/g,"\/")))); } var current_time = "20

比較陣列的不同 java

// 返回不相同的元素 public static Set<String> getdiff(String[] a, String[] b){ Set<String> diff = new HashSet<String>(); //用

java比較double型別值的大小

非整型數,運算由於精度問題,可能會有誤差,建議使用BigDecimal型別,具體 BigDecimal的詳細說明參考jdk開發幫助文件。 import java.math.BigDecimal; public class DoubleCompare { public String co

Oracle--Oracle資料庫中插入日期日期帶有分秒(java.util.Date型別)

       通過JDBC向oracle資料庫中插入時間型別時間時,可以直接向資料庫中插入java.sql.Date型別的時間,但是時間只包含年月日,沒有時分秒。如果需要通過JDBC向oracle中插入java.util.Date型別的時間,先將Date轉換成格式化字串,再進

Java方法案例--比較值是否相等

package com.zhangxueliang.demo; import java.util.Scanner; @SuppressWarnings("all") public class Met