2009-04-05 19 views
8

Mi programa consiste en generar (producir) un Kurosawa y hacer que los clientes lo produzcan.Fecha de aritmética en Java, agregando 3 meses a partir de hoy

Cada vez que generamos un Kurosawa, tenemos que imprimir su identificación, su fecha de producción y su fecha de vencimiento, que es de 3 meses desde la fecha de producción.

Mi problema es: ¿Cómo puedo calcular la fecha después de 3 meses?

+0

BTW, ¿Qué es un Kurosawa? –

+1

Según Wikipedia, es un sake elaborado en Saku, Nagano, Japón. –

Respuesta

15

Utilice la función incorporada Java Calendar API.

Calendar c = Calendar.getInstance(); 
c.add(Calendar.MONTH, 3); 

Consulte la API para saber exactamente cómo imprimir la fecha, en el formato que está buscando.

9

También es posible usar la mucho más potente y más fácil de usar Joda Time Library:

DateMidnight productionDate = new DateMidnight(); 
DateMidnight expirationDate = productionDate.plusMonths(3); 
System.out.println(expirationDate.toString("dd.MM.yyyy")); 

Joda Time tiene muchas ventajas con respecto a la incorporada en el Java Calendar API.

+0

¿Por qué usar Joda para algo tan simple como agregar 3 meses a una fecha? – javashlook

+1

Tiene razón, pero cuando agrega 3 meses a un java.util.Date/Calendar manipula la misma instancia que podría ser propensa a errores. Los objetos Joda-Time son inmutables.Y creo que normalmente haces algo más que con las fechas que solo agregar 3 meses. Espero que Java7 incluya Joda-Time (JSR310) –

0

Si tiene que trabajar con la aritmética de fechas obras JODA mejor, ya que Calendar le gusta las marcas de tiempo.

0

/El calendario de la clase Java es abstracto. Entonces necesitas usar la clase GregorianCalendar./

java.util.GregorianCalendar gC = new java.util.GregorianCalendar(); 

java.util.Date yourDate = new java.util.Date(); 
gC.setTime(yourDate); 

/Añadir 3 meses/

gC.add(java.util.Calendar.MONTH_OF_YEAR, 3); 

/volver 1 semana/

gC.add(java.util.Calendar.WEEK_OF_YEAR, -1); 
+2

The [getInstance] (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getInstance%28%29) los métodos de Calendar son estáticos para que pueda usarlos. – KSev

+1

Y son preferidos, porque getInstance() es un método de fábrica estático (ver Effective Java, Joshua Bloch) que tratará de determinar el mejor momento para su configuración regional. –

1

tl; dr

LocalDate.now()   // Determine today’s date. 
     .plusMonths(3) // Add three months. 

java.time

El enfoque moderno usa clases de java.time.

La clase LocalDate representa un valor de fecha solamente sin hora del día y sin zona horaria.

Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en Paris France es un nuevo día mientras aún está "ayer" en Montréal Québec.

Si no se especifica la zona horaria, la JVM aplica implícitamente su zona horaria predeterminada actual. Ese valor predeterminado puede cambiar en cualquier momento, por lo que sus resultados pueden variar. Es mejor especificar su zona horaria deseada/esperada explícitamente como un argumento.

Especifique un proper time zone name en el formato de continent/region, como America/Montreal, Africa/Casablanca, o Pacific/Auckland.Nunca use la abreviatura de 3-4 letras como EST o IST ya que son no zonas horarias verdaderas, no estandarizadas, y ni siquiera únicas (!).

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Agregue tres meses, dejando que java.time haga los cálculos.

LocalDate threeMonthsLater = today.plusMonths(3) ; 

Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….

El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter y more.

Cuestiones relacionadas