2014-11-18 33 views
108

Tôi biết có rất nhiều câu hỏi về SO về cách nhận, nhưng tôi muốn và ví dụ bằng cách sử dụng Java 8 Ngày api mới. Tôi cũng biết thư viện JodaTime, nhưng tôi muốn một cách làm việc không có thư viện bên ngoài.Tính ngày giữa hai ngày trong Java 8

Chức năng cần phải phàn nàn với những hạn chế:

  1. Ngăn chặn lỗi kể từ ngày savetime
  2. Input là hai đối tượng ngày của (không có thời gian, tôi biết localdatetime, nhưng tôi cần phải làm gì với trường hợp ngày)
+2

Giống như [ví dụ này] (http://stackoverflow.com/questions/25776787/java-simpledateformat-format-issue-with-yyyy/25777559#25777559)? – MadProgrammer

+0

@MadProgrammer Không thực sự - Thời lượng không phù hợp nhất để làm điều đó ... – assylias

+0

@assylias Vâng, nó tốt hơn so với những gì OP có – MadProgrammer

Trả lời

176

Nếu bạn muốn logic ngày tính theo lịch, sử dụng phương pháp DAYS.between() từ java.time.temporal.ChronoUnit:

LocalDate dateBefore; 
LocalDate dateAfter; 
long daysBetween = DAYS.between(dateBefore, dateAfter); 

Nếu bạn muốn đen 24 giờ ngày, (một thời gian ), bạn có thể sử dụng lớp Duration thay vì:

LocalDate today = LocalDate.now() 
LocalDate yesterday = today.minusDays(1); 
// Duration oneDay = Duration.between(today, yesterday); // throws an exception 
Duration.between(today.atStartOfDay(), yesterday.atStartOfDay()).toDays() // another option 

Để biết thêm thông tin, hãy tham khảo this document (và các tài liệu khác lại: Java 8 từ Oracle).

+7

Điều đó ném một ngoại lệ, vì [phương thức Duration.between yêu cầu các đối tượng thời gian có khả năng hỗ trợ đơn vị SECONDS] (https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html# giữa-java.time.temporal.Temporal-java.time.temporal.Temporal-). Thay vào đó, hãy thử 'Duration.between (today.atTime (0, 0), today.atTime (0, 0)). ToDays()'. – VGR

+2

-1 Thời lượng không phải là công cụ thích hợp để thực hiện điều đó. – assylias

+2

Thay vì 'today.atTime (0, 0)' bạn có thể làm 'today.atStartOfDay()'. – eee

65

Dựa trên ý kiến ​​của VRG đây là những gì bạn có thể sử dụng:

ChronoUnit.DAYS.between(firstDate, secondDate) 
7

Bạn có thể sử dụng DAYS.between từ java.time.temporal.ChronoUnit

ví dụ

import java.time.temporal.ChronoUnit; 

public long getDaysCountBetweenDates(LocalDate dateBefore, LocalDate dateAfter) { 
    return DAYS.between(dateBefore, dateAfter); 
} 
14

Bạn có thể sử dụng until():

LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); 
LocalDate christmas = LocalDate.of(2014, Month.DECEMBER, 25); 

System.out.println("Until christmas: " + independenceDay.until(christmas)); 
System.out.println("Until christmas (with crono): " + independenceDay.until(christmas, ChronoUnit.DAYS)); 
+1

Câu lệnh System.out.println thứ hai là thứ tôi đang tìm kiếm. Cảm ơn! – Sedrick

2

Sử dụng DAYS trong enum java.time.temporal.ChronoUnit. Dưới đây là Bộ luật Mẫu:

Output: * Số ngày giữa ngày bắt đầu: 2015/03/01 và ngày kết thúc: 2016/03/03 được ==> 368. ** Số ngày giữa ngày bắt đầu: 2016/03/03 và ngày kết thúc: 2015/03/01 là ==> -368 *

package com.bitiknow.date; 

import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 

/** 
* 
* @author pradeep 
* 
*/ 
public class LocalDateTimeTry { 
    public static void main(String[] args) { 

     // Date in String format. 
     String dateString = "2015-03-01"; 

     // Converting date to Java8 Local date 
     LocalDate startDate = LocalDate.parse(dateString); 
     LocalDate endtDate = LocalDate.now(); 
     // Range = End date - Start date 
     Long range = ChronoUnit.DAYS.between(startDate, endtDate); 
     System.out.println("Number of days between the start date : " + dateString + " and end date : " + endtDate 
       + " is ==> " + range); 

     range = ChronoUnit.DAYS.between(endtDate, startDate); 
     System.out.println("Number of days between the start date : " + endtDate + " and end date : " + dateString 
       + " is ==> " + range); 

    } 

} 
3

Ở đây bạn đi:

public class DemoDate { 
    public static void main(String[] args) { 
     LocalDate today = LocalDate.now(); 
     System.out.println("Current date: " + today); 

     //add 1 month to the current date 
     LocalDate date2 = today.plus(1, ChronoUnit.MONTHS); 
     System.out.println("Next month: " + date2); 

     // Put latest date 1st and old date 2nd in 'between' method to get -ve date difference 
     long daysNegative = ChronoUnit.DAYS.between(date2, today); 
     System.out.println("Days : "+daysNegative); 

     // Put old date 1st and new date 2nd in 'between' method to get +ve date difference 
     long datePositive = ChronoUnit.DAYS.between(today, date2); 
     System.out.println("Days : "+datePositive); 
    } 
} 
0

số Nhận ngày trước lễ Giáng sinh từ ngày hiện tại, hãy thử điều này

System.out.println(ChronoUnit.DAYS.between(LocalDate.now(),LocalDate.of(Year.now().getValue(), Month.DECEMBER, 25))); 
0

Mọi người đều nói sử dụng ChronoUnit.DAYS.between nhưng chỉ ủy quyền cho một phương pháp khác mà bạn có thể gọi cho chính mình. Vì vậy, bạn cũng có thể làm firstDate.until(secondDate, ChronoUnit.DAYS).

Tài liệu cho cả hai thực sự đề cập đến cả hai phương pháp tiếp cận và nói để sử dụng cái nào dễ đọc hơn.

+0

FWIW ... Tôi không chắc tại sao cả hai đều tồn tại. Có lần nào người ta có thể đọc được nhiều hơn và lần kia người đó có thể đọc được không? Khi nao tại sao? – nafg

Các vấn đề liên quan