2010-03-04 11 views
12

Puedo saber cuál es la forma más eficiente de construir un objeto de fecha usando un día, mes y año específicos.Fecha de construcción: una forma eficiente

Date(int year, int month, int day) 

Este constructo está depreciado. Por lo tanto, lo que suelo hacer es:

Calendar calendar = Calendar.getInstance(); 
Date date = calendar.set(year, month, date).getTime(); 

Sin embargo, mi opinión es que Calendar.getInstance() es bastante caro. ¿Cuál es la forma más eficiente de construir un objeto Date? ¿O debería usar Date (int year, int month, int day) en silencio sin decir el resto?

No sugiera el uso de ninguna biblioteca de terceros.

+1

¿Alguna razón en particular para no usar una biblioteca de terceros? Joda Time es * mucho * mejor API que las incorporadas. A menos que tenga una razón realmente buena para no usarla, le recomiendo encarecidamente que la use. –

+1

Sí. Sé que 9 de cada 10 me sugerirán usar Joda Time. Es por eso que puse un comentario en ninguna biblioteca de terceros :) –

+0

Creo que si no quieres ninguna biblioteca, estás muy atascado. Normalmente, 4 de cada 5 desarrolladores recomendarían Joda Time para cualquier cosa relacionada con la fecha. – sfussenegger

Respuesta

15

Con esto puede evitar la creación de instancia "ahora" instantánea.

Date coolDate = new GregorianCalendar(year, month, day).getTime(); 

Puede consultar GregorianCalendar javadoc para otros constructores. Tienes fecha + hora y zona horaria.

De todos modos, estoy de acuerdo con Jon Skeet en que no es tan caro. Estoy de acuerdo con usted en que el código no necesita una inicialización "ahora" predeterminada.

+0

+1 para construir directamente, pero tenga cuidado de usar un calendario específico. – medopal

+0

Sí. Entiendo que usar día, mes, año implica un conocimiento sobre el calendario que se está usando (pero si se trata de DMY ... no hay ningún método para crear el calendario ... :) – helios

+1

El punto de usar 'Calendar.getInstance () 'es para permitir diferencias específicas de la configuración regional. Crear un 'GregorianCalendar' directamente desecha ese beneficio para salvar ... una línea de código. Sería mejor simplemente poner la creación en un método de fábrica estático. – cletus

6

"Bastante caro" es algo vago. ¿Realmente ha intentado usar el código que ha suministrado, lo ha medido y encontrado que es demasiado caro? ¿Tiene una idea concreta de cuán barato necesita que sea esta operación?

Además, no ha especificado qué zona horaria desea que represente el valor en Date. ¿UTC? La zona horaria predeterminada? ¿A qué hora del día desea que sea - la medianoche o la hora actual del día? Su código actual mantendrá la hora del día existente. ¿Es eso realmente lo que quiere?

(Como mencioné en un comentario, le sugiero encarecidamente que se mude a Joda Time, pero incluso si no lo hace, aún debe comprobar si realmente tiene un problema con su código existente antes de buscar para una solución.)

+2

Joda Time es probablemente excesivo. "Caro" en relación con Calendarios es algo que fue verdad en el JDK 1.4 días que ha persistido. Estaba bajo el mismo concepto erróneo que el OP hasta que lo probé y podría fácilmente crear instancias de cientos de miles de estos por segundo sin problema. – cletus

+2

@cletus: La mayor parte de mis razones para recomendar Joda Time no es acelerar esto, sino utilizar una mejor API. Supongo que si está creando una Fecha, también la usará. Joda Time es simplemente una mejor forma de manejar fechas y horas, punto. –

+1

Uno tiene que preguntarse si Joda Time se ha convertido en Java, lo que jQuery se ha convertido en Javascript: algo siempre sugerido. :) – cletus

1

Lo que usted utiliza, siempre y cuando sea en la API estándar de Java, que implicará el uso de Calendar (tanto el Date constructor y SimpleDateFormat utilizarlo internamente), por lo que no tiene sentido preocupándose por supuesta ineficiencia de esa clase.

1

yo simplemente hacer esto:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
Date thisDate = formatter.parse("2010-03-04"); 

Es bastante eficiente desde el punto de vista de líneas de código; No puedo hablar de su eficiencia de tiempo de ejecución frente a Calendar.

Cuestiones relacionadas