2010-09-22 18 views

Respuesta

85

Si usted tiene un objeto DateTime que representa un valor en el mes, entonces es bastante sencillo. Obtiene la propiedad dayOfMonth de ese objeto DateTime y obtiene el valor máximo de la propiedad. Aquí es una función de ejemplo:

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

Esto no funcionó para mí. getMaximumValue() devuelve 31 para noviembre, que por supuesto no es correcto. –

+7

@ChrisGerken: ¿Tal vez sus meses no tienen índices? Para JODA, el mes debe ser un valor del 1-12. Si usó 10 para noviembre, JODA lo verá como octubre y devolverá 31. –

+0

Casi todos mis errores relacionados con la fecha se deben a que JODA no está indexado a cero. ¡Es difícil de recordar! –

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

Eso no es Jodatime. El OP explícitamente pidió esto. – BalusC

+0

Oups. Exacto ... Me centré en el problema y olvidé el título ... Pero si el resultado se puede obtener fácilmente con la API estándar, una API externa como JodaTime es inútil. –

+5

Me quedaría personalmente * bien * lejos de java.util.Calendar. Joda Time es una API muy, muy superior. Por ejemplo, ¿qué tan seguro está usted acerca de qué hará eso si lo configura en febrero cuando 'getInstance' regrese el 31 de septiembre? Ah, y no olvides que febrero es el mes 1 ... –

3

Sí, aunque no es tan bonito como podría ser:

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)); 
     } 
    } 
} 

Nota que he programado en forma fija el supuesto de que hay 12 meses, y que estamos interesados ​​en 2010. Sin embargo, explícitamente seleccioné la cronología gregoriana; en otras cronologías obtendría respuestas diferentes, por supuesto. (Y el ciclo "12 meses" no sería una suposición válida, ya sea ...)

He pasado por un LocalDate en lugar de un DateTime con el fin de buscar el valor, para enfatizar (sin embargo débilmente :) que el valor no depende de la zona horaria.

Esto todavía no es tan simple como parece, te importa. No sé de improviso qué sucede si utilizo una cronología para construir el LocalDate, pero solicito el valor máximo de un campo en una cronología diferente. Tengo algunas ideas sobre lo que sucede fuerza, sabiendo que una cierta cantidad de tiempo sobre Joda, pero no es probablemente una buena idea :)

-1

Aquí es otra función simple:

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); 
} 
Cuestiones relacionadas