2012-09-19 35 views
13

Necesito generar un nuevo objeto de fecha para la fecha de caducidad de la tarjeta de crédito, solo tengo un mes y un año, ¿cómo puedo generar una fecha basada en esos dos? Necesito la forma más fácil posible. Estaba leyendo algunas otras respuestas aquí, pero todas parecen demasiado sofisticadas.¿Cómo generar una fecha de solo mes y año en Java?

+0

¿Por qué no usa ningún dígito entre 1 y 31 para el día, por ejemplo 1? – krackmoe

+1

¿Una nueva fecha ("2013-04-01")? – antonpug

+0

No, tienes que usar Calendar o GregorianCalendar. Pero puede establecer el día, mes, año con: conjunto (int año, mes int, fecha int) y con getTime() obtiene un objeto Date devuelto – krackmoe

Respuesta

37

Usted podría utilizar java.util.Calendar:

Calendar calendar = Calendar.getInstance(); 
calendar.clear(); 
calendar.set(Calendar.MONTH, month); 
calendar.set(Calendar.YEAR, year); 
Date date = calendar.getTime(); 
+2

No puedo usar la nueva fecha ("2013-05-01")? No he programado en Java desde hace tiempo, pero en la mayoría de los idiomas, ¿parece una forma de sentido común hacerlo? – antonpug

+4

Como advertencia, el campo día se establecería en la fecha de hoy. Compruebe el comportamiento previsto si el día actual está fuera de los límites del mes objetivo. Por ejemplo, establecer el mes en febrero cuando 'calendario' tiene un campo de día de 30. Puede ser conveniente establecer el día en un valor válido conocido para cada mes (por ejemplo: 1) antes de configurar el mes y el año. –

+0

Buen punto, mejor borrar todos los valores predeterminados – Reimeus

5

Posiblemente no responda ya que solicitó un java.util.Date, pero parece una buena oportunidad para señalar que la mayoría de los trabajos con fechas y horas y calendarios en Java deberían realizarse con la biblioteca Joda-Time, en cuyo caso

new LocalDate(year, month, 1) 

me viene a la mente.

Joda-Time tiene otras cosas agradables relacionadas con los días del mes. Por ejemplo, si desea conocer el primer día del mes en curso, se puede escribir

LocalDate firstOfThisMonth = new LocalDate().withDayOfMonth(1); 

En su comentario le preguntas acerca de pasar una cuerda a la java.util.Date constructor, por ejemplo:

new Date("2012-09-19") 

Este La versión del constructor es obsoleta, por lo que no la use. Debe crear un formateador de fecha y llamar al parse. Este es un buen consejo porque probablemente tendrá year y month como valores enteros, y necesitará hacer una buena cadena, acolchada y delimitada adecuadamente y todo eso, lo cual es increíblemente difícil de conseguir en todos los casos. Por esa razón, use el formateador de fechas que sabe cómo encargarse perfectamente de todo eso.

Otras respuestas anteriores mostraron cómo hacerlo.

+0

Bueno, un recurso que estoy aprobando para tomar una Fecha, así que tengo que proporcionarlo. – antonpug

+0

Sí, lo siento, amplié la respuesta ... –

0

El enfoque más común sería utilizar el constructor Fecha ("YYYY-MM-DD") aunque esté en desuso. Esta es la forma más fácil de crear una fecha sobre la marcha. Atornille a quien haya decidido desaprobarlo. Larga vida a la fecha ("AAAA-MM-DD") !!!

+0

Ese constructor funciona de manera no confiable en las zonas horarias. En resumen, no está bien definido lo que obtienes de él. Obtiene esa fecha a medianoche en algún huso horario, que aún deja espacio para 26 o 27 horas de variación. El constructor estaba en desuso por una razón. –

17

java.tiempo

Uso java.time marco construido en Java 8

import java.time.YearMonth; 

int year = 2015; 
int month = 12; 
YearMonth.of(year,month); // 2015-12 

de String

YearMonth.parse("2015-12"); // 2015-12 

con la costumbre DateTimeFormatter

import java.time.format.DateTimeFormatter; 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM yyyy"); 
YearMonth.parse("12 2015", formatter); // 2015-12 

Conversiones Para convertir YearMonth a una representación de fecha más estándar que es LocalDate.

LocalDate startMonth = date.atDay(1); //2015-12-01 
LocalDate endMonth = date.atEndOfMonth(); //2015-12-31 
0

No utilice esta respuesta. Use las respuestas por Przemek y Ray Toel. Como dice Przemek, prefiere usar un YearMonth para representar el año y el mes. Como dicen ambos, si debe usar una fecha, use LocalDate, es una fecha sin hora del día.

Si absolutamente necesita un objeto antiguo java.util.Date para una API heredada que no puede cambiar, aquí hay una manera fácil de obtener uno. Puede que no funcione como se desee, puede que no le proporcione exactamente la fecha que necesita, depende de sus requisitos exactos.

YearMonth expiration = YearMonth.of(2021, 8); // or .of(2021, Month.AUGUST); 
    Date oldFashionedDateObject = Date.from(expiration 
      .atDay(1) 
      .atStartOfDay(ZoneId.systemDefault()) 
      .toInstant()); 
    System.out.println(oldFashionedDateObject); 

En mi ordenador imprime

Sun Aug 01 00:00:00 CEST 2021 

Lo que tenemos es el primer día del mes a medianoche en mi zona horaria local - más precisamente, configuración de zona horaria de mi JVM. Esta es una buena idea de lo que espera su API heredada, pero también es peligroso. La configuración de la zona horaria de la JVM puede cambiarse bajo nuestros pies por otras partes del programa o por otros programas que se ejecutan en la misma JVM. En otras palabras, no podemos estar seguros de lo que obtenemos.

El problema de la zona horaria empeora si la fecha se transmite a una computadora con un huso horario diferente, como de cliente a servidor o viceversa, oa una base de datos que tenga su propia zona horaria. Hay un 50% de riesgo de que su Date llegue en el último mes.

Si conoce la zona horaria requerida al final, le ayudará a especificar por ejemplo ZoneId.of("America/New_York") en lugar de la configuración predeterminada del sistema en el fragmento de arriba.

Si su API es indulgente y solo necesita algún punto en el mes correcto, será mejor que le conceda el 2 ° del mes UTC o el 3 ° del mes en su propia zona horaria. He aquí cómo hacer lo anterior:

Date oldFashionedDateObject = Date.from(expiration 
      .atDay(2) 
      .atStartOfDay(ZoneOffset.UTC) 
      .toInstant()); 
Cuestiones relacionadas