2009-03-13 48 views
6

Tôi muốn thực hiện các phép tính ngày đơn giản trong Java. Ví dụ, tính toán sự khác biệt trong ngày giữa các ngày (có một thành phần thời gian 0). Tất nhiên bạn có thể làm một bản chất đơn giản của mili giây, chia cho số mili giây mỗi ngày, hoạt động tốt - cho đến khi thời gian tiết kiệm ánh sáng ban ngày nhập cảnh. Tôi ý thức rằng các cách giải thích khác nhau về "sự khác biệt trong ngày" là có thể, đặc biệt, liệu người ta có nên tính đến thành phần thời gian hay không. Giả sử chúng ta có một thành phần thời gian 0 để đơn giản.Tính toán ngày Java đơn giản

Loại tính toán này có vẻ là một nhu cầu rất phổ biến và tôi sẽ thấy thật tuyệt khi thảo luận về các cách tiếp cận khác nhau đối với câu hỏi.

+0

JODA TIME !!!!!! (Trước khi vội vàng!) –

+0

[java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) !!!!!! –

Trả lời

11

Tôi sẽ xem thư viện ngày/giờ Joda và đặc biệt là lớp ReadableInterval.

Joda làm cho cuộc sống dễ dàng hơn nhiều khi thao tác ngày/giờ trong Java, và tôi tin rằng đó là nền tảng của Java mới JSR 310 wrt. ngày/giờ. tức là nó (hoặc một cái gì đó rất giống nhau) sẽ có mặt trong một phiên bản tương lai của Java.

+0

FYI, dự án [Joda-Time] (http://www.joda.org/joda-time/) hiện đang ở [chế độ bảo trì] (https://en.wikipedia.org/wiki/Maintenance_mode), với nhóm cố vấn di chuyển đến các lớp [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Here is an article thảo luận về việc sử dụng các cơ sở Ngày/Lịch trong java để tính thời gian trôi qua.

3

Có vẻ như Ngày, Lịch và DateUtils sẽ làm mọi thứ bạn đang tìm kiếm. http://commons.apache.org/lang/api/org/apache/commons/lang/time/DateUtils.html

DateUtils cho phép cắt ngắn hoặc làm tròn thời gian để bạn chỉ có thể xử lý chỉ các ngày. Bạn cũng đã đề cập đến thời gian tiết kiệm ánh sáng ban ngày. Vấn đề chính là khi ai đó nói rằng họ đã làm gì đó vào lúc 01:30 vào một ngày có thay đổi DST ... trong đó 01:30 là gì? Cái đầu tiên hay thứ hai? May mắn là điều này có thể được xử lý bởi lớp Lịch vì nó lưu trữ múi giờ và bù DST. Để biết chi tiết cụ thể, hãy kiểm tra điều này: http://www.xmission.com/~goodhill/dates/deltaDates.html

2

Tùy chọn đơn giản hơn là sử dụng các lớp Ngày, Tuần, Tháng và Năm ở Joda.

Bằng cách đó, bạn có thể làm điều gì đó đơn giản như:

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays(); 
+0

Và để chuyển đổi các đối tượng 'java.util.Date' hiện có thành' ReadableIntervals' mà bạn có thể chuyển sang 'daysBetween', bạn có thể làm:' new DateTime (somejavautildate) ' –

+0

FYI, [Joda-Time] (http: //www.joda.org/joda-time/) dự án hiện đang ở [chế độ bảo trì] (https://en.wikipedia.org/wiki/Maintenance_mode), với nhóm tư vấn di chuyển đến [java.time] (http://docs.oracle.các lớp com/javase/8/docs/api/java/time/package-summary.html). Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Sử dụng java.time

Cách tiếp cận hiện đại với các lớp java.time, thay thế các lớp học ngày thời gian di sản cũ phiền hà .

tính toán sự khác biệt trong những ngày giữa để ngày (có một thành phần 0 lần)

Lớp LocalDate đại diện cho một giá trị ngày tháng chỉ mà không cần thời gian của ngày và không có múi giờ.

ChronoUnit enum có một số phương pháp tiện dụng như between.

Trong việc xác định khoảng thời gian, các lớp java.time sử dụng phương pháp Nửa mở khi bắt đầu là bao gồm trong khi kết thúc là độc quyền.

LocalDate start = LocalDate.of(2017 , Month.JANUARY , 23); 
LocalDate stop = LocalDate.of(2017 , Month.FEBRUARY , 17); 
long daysBetween = ChronoUnit.DAYS.between(start , stop); 

Bạn có thể biểu thị khoảng thời gian đó làm đối tượng, sử dụng lớp Period.

Period p = Period.between(start , stop); 

Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Nơi lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

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