日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java计算时间差、日期差总结(亲测)

發(fā)布時(shí)間:2024/9/20 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java计算时间差、日期差总结(亲测) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java計(jì)算時(shí)間差、日期差總結(jié)
最近工作中遇到需要計(jì)算時(shí)間差,搜索了幾種計(jì)算時(shí)間差的方法,這里總結(jié)一下

1、java 7中的日歷類Calendar
Calendar類使用其靜態(tài)的getInstance()方法獲取一個(gè)日歷實(shí)例,該實(shí)例為當(dāng)前的時(shí)間;如果想改變時(shí)間,可以通過其setTime方法傳入一個(gè)Date對(duì)象,即可獲得Date對(duì)象所表示時(shí)間的Calendar對(duì)象

/**
?*使用Calendar對(duì)象計(jì)算時(shí)間差,可以按照需求定制自己的計(jì)算邏輯
?* @param strDate
?* @throws ParseException
?*/
public static void calculateTimeDifferenceByCalendar(String strDate) throws ParseException {
? ? SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
? ? Date date = formatter.parse(strDate);

? ? Calendar c1 = Calendar.getInstance(); ? //當(dāng)前日期
? ? Calendar c2 = Calendar.getInstance();
? ? c2.setTime(date); ? //設(shè)置為另一個(gè)時(shí)間

? ? int year = c1.get(Calendar.YEAR);
? ? int oldYear = c2.get(Calendar.YEAR);

? ? //這里只是簡單的對(duì)兩個(gè)年份數(shù)字進(jìn)行相減,而沒有考慮月份的情況
? ? System.out.println("傳入的日期與今年的年份差為:" + (year - oldYear));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
輸出為:

傳入的日期與今年的年份差為:12
1
2、java 8中的周期類Period
通過調(diào)用Period類的靜態(tài)方法between,傳入兩個(gè)待比較的LocalDate對(duì)象today與oldDate,得到的Period的對(duì)象p中就包含了today與oldDate兩個(gè)日期相差的年、月、日信息,可以通過p.getYears()等方法取出

/**
?* 使用java 8的Period的對(duì)象計(jì)算兩個(gè)LocalDate對(duì)象的時(shí)間差,嚴(yán)格按照年、月、日計(jì)算,如:2018-03-12 與 2014-05-23 相差 3 年 9 個(gè)月 17 天
?* @param year
?* @param month
?* @param dayOfMonth
?*/
public static void calculateTimeDifferenceByPeriod(int year, Month month, int dayOfMonth) {
? ? LocalDate today = LocalDate.now();
? ? System.out.println("Today:" + today);
? ? LocalDate oldDate = LocalDate.of(year, month, dayOfMonth);
? ? System.out.println("OldDate:" + oldDate);

? ? Period p = Period.between(oldDate, today);
? ? System.out.printf("目標(biāo)日期距離今天的時(shí)間差:%d 年 %d 個(gè)月 %d 天\n", p.getYears(), p.getMonths(), p.getDays());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
輸出為:

Today:2018-03-13
OldDate:2014-05-23
目標(biāo)日期距離今天的時(shí)間差:3 年 9 個(gè)月 18 天
1
2
3
3、java 8中的Duration類
Duration與Period相對(duì)應(yīng),Period用于處理日期,而Duration計(jì)算時(shí)間差還可以處理具體的時(shí)間,也是通過調(diào)用其靜態(tài)的between方法,該方法的簽名是between(Temporal startInclusive, Temporal endExclusive),因此可以傳入兩個(gè)Instant的實(shí)例(Instant實(shí)現(xiàn)了Temporal接口),并可以以毫秒(toMillis)、秒(getSeconds)等多種形式表示得到的時(shí)間差

public static void calculateTimeDifferenceByDuration() {
? ? Instant inst1 = Instant.now(); ?//當(dāng)前的時(shí)間
? ? System.out.println("Inst1:" + inst1);
? ? Instant inst2 = inst1.plus(Duration.ofSeconds(10)); ? ? //當(dāng)前時(shí)間+10秒后的時(shí)間
? ? System.out.println("Inst2:" + inst2);
? ? Instant inst3 = inst1.plus(Duration.ofDays(125)); ? ? ? //當(dāng)前時(shí)間+125天后的時(shí)間
? ? System.out.println("inst3:" + inst3);

? ? System.out.println("以毫秒計(jì)的時(shí)間差:" + Duration.between(inst1, inst2).toMillis());

? ? System.out.println("以秒計(jì)的時(shí)間差:" + Duration.between(inst1, inst3).getSeconds());
}
1
2
3
4
5
6
7
8
9
10
11
12
輸出為:

Inst1:2018-03-13T09:06:00.691Z
Inst2:2018-03-13T09:06:10.691Z
inst3:2018-07-16T09:06:00.691Z
以毫秒計(jì)的時(shí)間差:10000
以秒計(jì)的時(shí)間差:10800000
1
2
3
4
5
4、java 8中的ChronoUnit類
ChronoUnit的between方法簽名為,between(Temporal temporal1Inclusive, Temporal temporal2Exclusive),需要注意的是,如果要以不同的單位展示時(shí)間差,between入?yún)⒅械臅r(shí)間對(duì)象必須包含有對(duì)應(yīng)的時(shí)間信息,否則會(huì)拋出java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit XXX的異常

/**
?* 使用java 8的ChronoUnit,ChronoUnit可以以多種單位(基本涵蓋了所有的,看源碼發(fā)現(xiàn)竟然還有“FOREVER”這種單位。。)表示兩個(gè)時(shí)間的時(shí)間差
?*/
public static void calculateTimeDifferenceByChronoUnit() {
? ? LocalDate startDate = LocalDate.of(2003, Month.MAY, 9);
? ? System.out.println("開始時(shí)間:" + startDate);

? ? LocalDate endDate = LocalDate.of(2015, Month.JANUARY, 26);
? ? System.out.println("結(jié)束時(shí)間:" + endDate);

? ? long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
? ? System.out.println("兩個(gè)時(shí)間之間的天數(shù)差為:" + daysDiff);
// ?long hoursDiff = ChronoUnit.HOURS.between(startDate, endDate); ?//這句會(huì)拋出異常,因?yàn)長ocalDate表示的時(shí)間中不包含時(shí)分秒等信息
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
輸出為:

開始時(shí)間:2003-05-09
結(jié)束時(shí)間:2015-01-26
兩個(gè)時(shí)間之間的天數(shù)差為:4280
1
2
3
5、傳統(tǒng)的SimpleDateFormat類
用SimpleDateFormat計(jì)算時(shí)間差的方法,網(wǎng)上找了一份,自己跑了一遍,可以使用,貼在下面

/**
* 用SimpleDateFormat計(jì)算時(shí)間差
* @throws ParseException?
*/
public static void calculateTimeDifferenceBySimpleDateFormat() throws ParseException {
? ? SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
? ? /*天數(shù)差*/
? ? Date fromDate1 = simpleFormat.parse("2018-03-01 12:00"); ?
? ? Date toDate1 = simpleFormat.parse("2018-03-12 12:00"); ?
? ? long from1 = fromDate1.getTime(); ?
? ? long to1 = toDate1.getTime(); ?
? ? int days = (int) ((to1 - from1) / (1000 * 60 * 60 * 24)); ?
? ? System.out.println("兩個(gè)時(shí)間之間的天數(shù)差為:" + days);

? ? /*小時(shí)差*/
? ? Date fromDate2 = simpleFormat.parse("2018-03-01 12:00"); ?
? ? Date toDate2 = simpleFormat.parse("2018-03-12 12:00"); ?
? ? long from2 = fromDate2.getTime(); ?
? ? long to2 = toDate2.getTime(); ?
? ? int hours = (int) ((to2 - from2) / (1000 * 60 * 60));
? ? System.out.println("兩個(gè)時(shí)間之間的小時(shí)差為:" + hours);

? ? /*分鐘差*/
? ? Date fromDate3 = simpleFormat.parse("2018-03-01 12:00"); ?
? ? Date toDate3 = simpleFormat.parse("2018-03-12 12:00"); ?
? ? long from3 = fromDate3.getTime(); ?
? ? long to3 = toDate3.getTime(); ?
? ? int minutes = (int) ((to3 - from3) / (1000 * 60)); ?
? ? System.out.println("兩個(gè)時(shí)間之間的分鐘差為:" + minutes);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
輸出為:

兩個(gè)時(shí)間之間的天數(shù)差為:11
兩個(gè)時(shí)間之間的小時(shí)差為:264
兩個(gè)時(shí)間之間的分鐘差為:15840
1
2
3
總結(jié)
傳統(tǒng)的SimpleDateFormat和Java 7中的Calendar在使用的時(shí)候需要自己寫一個(gè)計(jì)算時(shí)間差的邏輯,比較麻煩,但是卻比較靈活,方便根據(jù)自己具體的需求來定制(比如,我想兩個(gè)日期的天數(shù)差15天就算滿一個(gè)月,不滿15天不算一個(gè)月,如2018-01-04到2018-02-20,算2個(gè)月的時(shí)間差);而Java 8中的幾個(gè)計(jì)算時(shí)間差的類更加方便、精確,可以以不同的單位表示得到的時(shí)間差,但要注意幾個(gè)類所包含的時(shí)間信息的區(qū)別:

System.out.println(LocalDate.now()); ? ? ? ?//只包含日期信息
System.out.println(LocalTime.now()); ? ? ? ?//只包含時(shí)間信息
System.out.println(LocalDateTime.now()); ? ? ? ?//包含日期、時(shí)間信息
1
2
3
輸出為:

2018-03-13
17:13:26.134
2018-03-13T17:13:26.135
1
2
3
以上總結(jié)的幾個(gè)方法只是個(gè)例子,具體使用的時(shí)候可能需要傳入一個(gè)或者兩個(gè)時(shí)間進(jìn)行比較,可能會(huì)涉及到這些時(shí)間對(duì)象的相互轉(zhuǎn)換,Instant、Date、LocalDate等等。。。我就不列舉了。。。
另外在使用SimpleDateFormat對(duì)String類型的日期進(jìn)行parse的時(shí)候,如果傳入的日期為:2017-08-60,這種錯(cuò)誤的日期,Java默認(rèn)會(huì)按照日期的信息對(duì)其進(jìn)行轉(zhuǎn)換,formatter.parse("2017-08-60");,得到的日期為2017-09-29,而如果不想進(jìn)行這種轉(zhuǎn)換,而直接將其判定為輸入錯(cuò)誤,則可以設(shè)置formatter.setLenient(false);,這時(shí)就會(huì)拋出java.text.ParseException異常了

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter.setLenient(false);
try {
? ? Date date = formatter.parse("2017-08-60"); ?//拋出轉(zhuǎn)換異常
? ? System.out.println(date);
} catch (ParseException e) {
? ? e.printStackTrace();
}
————————————————
版權(quán)聲明:本文為CSDN博主「sy793314598」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sy793314598/article/details/79544796

總結(jié)

以上是生活随笔為你收集整理的Java计算时间差、日期差总结(亲测)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。