2012-06-21 42 views
11

Tôi đang sử dụng phương thức compareTo trong Java để thử và kiểm tra xem một ngày nhất định có lớn hơn hoặc bằng 24 giờ sau một ngày khác hay không.Kiểm tra xem một ngày có đúng 24 giờ hoặc hơn sau

Làm cách nào để xác định số nguyên nào để so sánh ngày với?

+5

Bạn có thể làm sáng tỏ? Bạn có nghĩa là 24 giờ, một ngày theo lịch hoặc ý của bạn là "các phân đoạn 24 giờ lân cận"? – cheeken

+1

Tôi không muốn kiểm tra xem đó có phải là ngày hôm sau hay không, tôi muốn kiểm tra xem nó có chính xác sau 24 giờ hay không. –

+0

bạn nghĩ gì về lớp GregorianCalendar? – 11684

Trả lời

7

Câu trả lời phụ thuộc vào những gì bạn muốn đạt được.

Một cách, có thể kiểm tra chênh lệch theo mili giây. 24 h trong mili giây có thể được tính thông qua

24 * 60 * 60 * 1000 = 86400000 
h  min sec millis 

(trong mã bạn cũng có thể viết TimeUnit.HOURS.toMillis(24) mà IMO là mô tả nhiều hơn)

Vì vậy, bây giờ bạn có thể chỉ cần kiểm tra xem sự khác biệt giữa hai ngày (tính bằng mili giây) là lớn hơn sau đó 86400000.

+2

Chỉ cần nhớ làm mọi thứ với số học 'long', không phải' int'. –

+0

Nếu bạn định sử dụng các đơn vị, hãy sử dụng chúng một cách chính xác. Ngay bây giờ, các đơn vị bạn có trong t^5 –

+1

@DaftPunk Bạn có ý nghĩa gì khi sử dụng không chính xác? '86400000' nằm trong phạm vi' int'. Ngoài ra không nên có vấn đề với việc so sánh 'long' với' int' như 'someLong1 - someLong2> someInt'. – Pshemo

13

Sử dụng lớp Calendar. Nếu bạn đã có một đối tượng Date, bạn vẫn có thể sử dụng Calendar:

Date aDate = . . . 
Calendar today = Calendar.getInstance(); 
today.setTime(aDate); 
Calendar tomorrow = Calendar.getInstance(); 
tomorrow.setTime(aDate); 
tomorrow.add(Calendar.DAY, 1); 
Date tomorrowDate = tomorrow.getTime(); // if you need a Date object 
+2

bạn cung cấp để sử dụng lịch và hiển thị cách chuyển đổi từ ngày này sang lịch khác, nhưng làm cách nào tôi có thể kiểm tra xem một lịch có đang theo lịch không? vẫn chưa được giải quyết. Tôi cần phải kiểm tra xem một lịch là từ ngày hôm nay hoặc từ một ngày trước đó, vì vậy nếu bạn có thể trả lời rằng nó cũng sẽ được tốt đẹp. –

+1

@YekhezkelYovel - Đó là tầm thường. 'Calendar' thực hiện' Comparable', vì vậy bạn có thể biết lịch nào là sau lịch khác bằng cách sử dụng 'cal1.compareTo (cal2)'. Nó sẽ âm nếu 'cal1' biểu thị thời gian trước' cal2', dương nếu nó đến sau, và 0 nếu chúng là cùng một lúc. –

+2

tầm thường hay không, đó là những gì Zach Sugano hỏi vì vậy bạn nên có bao gồm trong câu trả lời của bạn. Giới thiệu về việc kiểm tra xem một ngày có từ ngày previouse (không bao gồm so sánh) tôi đã tìm thấy bài đăng này http://stackoverflow.com/questions/2517709/java-comparing-two-dates-to-see-if-they-are-in- cùng ngày hữu ích. –

0

Để tìm vùng đồng bằng giữa ngày: Nói tóm lại,

long endL = end.getTimeInMillis() + end.getTimeZone().getOffset(end.getTimeInMillis()); 
long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis()); 
return (endL - startL)/MILLISECS_PER_DAY; 

Cụ thể,

http://user.xmission.com/~goodhill/dates/deltaDates.html

3

tl; dr

myUtilDate_B 
    .toInstant() 
    .equals( 
     myUtilDate_A.toInstant().plus(24 , ChronoUnit.HOURS) 
    ) // Exactly 24 hours apart. 

... và ...

012.
myUtilDate_B 
    .toInstant() 
    .isAfter( 
     myUtilDate_A.toInstant().plus(24 , ChronoUnit.HOURS) 
    ) // Over 24 hours apart. 

Ngoài ra ...

Duration.between(myUtilDate_A , myUtilDate_B) 
     .compareTo(Duration.ofHours(24)) 
     // Returns 0 if exactly 24 hours apart, 
     //   >0 if over 24 hours apart. 

java.time

Bạn đặc biệt yêu cầu so sánh hai ngày-lần để hỏi nếu một trong hai:

  • Là một trong chính xác 24 giờ muộn hơn
  • khác
  • Có thời gian trễ hơn 24 giờ so với phiên bản khác.

Phương thức compareTo mà bạn đã đề cập không thực hiện việc này. Nó được thiết kế để chỉ cho biết một khoảnh khắc là như nhau, sau đó, hoặc sớm hơn. Phương pháp này không quan tâm đến các khoảng thời gian cụ thể như 24 giờ.

Bạn đã chỉ định cụ thể rằng ngày không quan trọng. Vì vậy, bạn muốn bỏ qua những bất thường như Daylight Saving Time (DST) làm cho một ngày dài hơn hoặc ngắn hơn 24 giờ.

Vì vậy, chúng tôi có thể làm việc trong UTC. Không cần múi giờ.

Nếu bạn đang đề cập đến java.util.Date đối tượng, trước tiên hãy chuyển đổi chúng thành đối tượng java.time. Lớp Date là một phần của các lớp ngày giờ phiền hà cũ, cùng với Calendar, hiện được thừa kế, được thay thế bởi các lớp java.time.

Tương đương với java.util.Datejava.time.Instant. Lớp Instant đại diện cho một thời điểm trên dòng thời gian trong UTC với độ phân giải nanoseconds (tối đa chín (9) chữ số của một phần thập phân).

Bạn có thể chuyển đổi sang/từ các loại java.time thông qua các phương thức mới được thêm vào các lớp cũ.

Instant start = myUtilDate_Start.toInstant(); 
Instant stop = myUtilDate_Stop.toInstant(); 

Xác định khoảng cách chúng tôi quan tâm, trong trường hợp này là hai mươi bốn giờ, làm đối tượng Duration.

Duration d = Duration.ofHours(24); // We mean literally 24 hours, not a day. 

Sử dụng số Duration để tính giá trị sau 24 giờ. Xác định đơn vị giờ theo ChronoUnit enum.

Instant target = start.plus(24 , ChronoUnit.HOURS); 

Cuối cùng, so sánh giá trị ngày giờ thứ hai. Hãy gọi equalsisAfter.

Boolean isExactly24HoursLater = stop.equals(target); 
Boolean isOver24HoursLater = stop.isAfter(target); 

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 sang 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?

  • Java SE 8SE 9 và sau
    • Built-in.
    • Một phần của API Java chuẩn với gói được triển khai.
    • Java 9 thêm một số tính năng và bản sửa lỗi nhỏ.
  • Java SE 6SE 7
    • Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport.
  • Android

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.


Joda thời gian

UPDATE: Dự án Joda-Time, bây giờ trong maintenance mode, khuyên chuyển đổi sang các lớp java.time. Phần này còn lại ở đây nguyên vẹn cho lịch sử.

Joda-Time làm cho công việc này dễ dàng hơn.

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime dateTimeInQuestion = new DateTime(2014, 1, 2, 3, 4, 5, 6, timeZone); // Or: new DateTime(someJavaDotUtilDotDateObject); 
DateTime now = new DateTime(timeZone); 
DateTime twentyFourHoursFromNow = now.plusHours(24); // Ignores Daylight Saving Time (DST). If you want to adjust for that, call: plusDays(1) instead. 
DateTime isDateTimeInQuestionAfter24HoursFromNow = dateTime.isAfter(twentyFourHoursFromNow); 

1 ngày ≠ 24 Hours

Nếu bạn thực sự có nghĩa là để xem xét cùng wall-clock time của ngày hôm sau, gọi plusDays(1) hơn plusHours(24). Joda-Time sau đó điều chỉnh cho Daylight Saving Time (DST) hoặc các dị thường khác. Ví dụ, ở đây tại Hoa Kỳ, điều đó có thể có nghĩa là 25 giờ thay vì 24 giờ vì sự thất thường DST 1 giờ của chúng tôi.

Hãy so sánh Trong vòng 24 giờ

Nếu thực sự có nghĩa là để kiểm tra xem ngày thời gian ở vùng đất câu hỏi trong rằng khoảng 24 giờ thời gian, sử dụng một trong ba lớp Joda thời gian cho nhịp của thời gian: Khoảng thời gian, khoảng thời gian và khoảng thời gian.

Interval interval = new Interval(now, twentyFourHoursFromNow); 
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains(dateTimeInQuestion); 

Đối với loại so sánh đó, Joda-Time sử dụng logic "Nửa mở". Điều này có nghĩa là ngày bắt đầu là bao gồm trong khi kết thúc là độc quyền. Nói cách khác, so sánh với GREATER THAN OR EQUAL TO (> =) bắt đầu, nhưng LESS THAN (<) kết thúc. Cách tiếp cận này thường có ý nghĩa nhất khi làm việc với ngày giờ.

1

này sẽ giúp bạn kiểm tra xem ngày của bạn là ngày hôm qua

public static final long ONE_MINUTE = 60 * 1000; 
public static final long ONE_HOUR = 60 * ONE_MINUTE; 
public static final long ONE_DAY = 24 * ONE_HOUR; 

public static boolean isYesterday(Date d) { 
    return DateUtils.isToday(d.getTime() + ONE_DAY); 
} 
0

Trong hoạt động của bạn OnCreate

//Get current date - yymmdd increases only 
    SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd"); 
    Date now = new Date(); 
    int nowTime= Integer.parseInt(formatter.format(now)); 

    //Get last login date - stored in db 
    int lastLogin= dbManager.getLastLoginDate(); 

    //Check if next day 
    if(nowTime> lastLogin){ 

     //Do your stuff 
     //Update last login date 
     dbManager.saveLoginDate(nowTime); 
    } 
Các vấn đề liên quan