2010-09-22 32 views

Trả lời

85

Nếu bạn có một đối tượng DateTime đại diện cho một giá trị trong tháng, sau đó nó khá đơn giản. Bạn nhận được tài sản dayOfMonth từ đối tượng DateTime và nhận giá trị tối đa của thuộc tính. Dưới đây là một hàm mẫu:

public static int daysOfMonth(int year, int month) { 
    DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000); 
    return dateTime.dayOfMonth().getMaximumValue(); 
} 
+0

Điều này không hiệu quả đối với tôi. getMaximumValue() trả về 31 cho tháng mười một, tất nhiên là không chính xác. –

+7

@ChrisGerken: Có thể tháng của bạn không được lập chỉ mục? Đối với JODA, tháng phải là giá trị từ 1-12. Nếu bạn sử dụng 10 cho tháng mười một, JODA sẽ thấy rằng như tháng Mười và trở về 31. –

+0

Gần như tất cả các lỗi liên quan đến ngày của tôi là vì JODA không được lập chỉ mục. Thật khó để nhớ! –

0
Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.MONTH, yourMonth); 
cal.set(Calendar.YEAR, yourYear); 
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result! 
+2

Đó không phải là Jodatime. OP đã yêu cầu điều này một cách rõ ràng. – BalusC

+0

Oups. Chính xác ... Tôi tập trung vào vấn đề và quên tiêu đề ... Nhưng nếu kết quả có thể thu được dễ dàng với API chuẩn, một API bên ngoài như JodaTime là vô dụng. –

+5

Tôi sẽ ở lại * well * cách xa java.util.Calendar. Thời gian Joda là một API xa hơn rất nhiều. Ví dụ, bạn tự tin về điều gì sẽ xảy ra nếu bạn đặt nó vào tháng 2 khi 'getInstance' trả về ngày 31 tháng 9? Oh, và đừng quên rằng tháng Hai là tháng 1 ... –

3

Vâng, mặc dù nó không xinh đẹp như nó có thể là:

import org.joda.time.*; 
import org.joda.time.chrono.*; 
import org.joda.time.field.*; 

public class Test { 
    public static void main(String[] args) { 
     GregorianChronology calendar = GregorianChronology.getInstance(); 
     DateTimeField field = calendar.dayOfMonth(); 

     for (int i = 1; i < 12; i++) { 
      LocalDate date = new LocalDate(2010, i, 1, calendar); 
      System.out.println(field.getMaximumValue(date)); 
     } 
    } 
} 

Lưu ý rằng tôi đã mã hóa cứng giả định rằng có 12 tháng, và rằng chúng tôi quan tâm đến năm 2010. Tôi đã rõ ràng là đã chọn niên đại Gregorian mặc dù - trong các niên đại khác, bạn sẽ nhận được các câu trả lời khác nhau, tất nhiên. (Và vòng lặp "12 tháng" sẽ không phải là giả định hợp lệ ...)

Tôi đã đi theo số LocalDate thay vì DateTime để tìm giá trị, để nhấn mạnh (tuy nhiên mờ nhạt :) giá trị không phụ thuộc vào múi giờ.

Điều này vẫn không đơn giản như mong đợi. Tôi không biết điều gì sẽ xảy ra nếu sử dụng một niên đại để xây dựng các LocalDate, nhưng yêu cầu giá trị tối đa của một trường trong một niên đại khác nhau. Tôi có một số ý tưởng về những gì sức xảy ra, biết một số tiền nhất định về Joda Thời gian, nhưng đây có thể không phải là một ý tưởng tốt :)

-1

Dưới đây là một chức năng đơn giản:

int daysOfMonth(DateTime dt) { 
    int month = dt.getMonthOfYear(); 
    int month2 = month; 
    int days = dt.getDay(); 
    DateTime dt2 = dt; 
    while (month == month2) { 
     days++; 
     dt2.addDays(1); 
     month2 = dt2.getMonthOfYear(); 
    } 
    return (days - 1); 
} 
Các vấn đề liên quan