2012-02-17 10 views
9

Estamos almacenando la fecha y la fecha y la hora como el objeto Date.¿Cómo saber si el objeto java.util.Date contiene la porción de tiempo?

Pero, más adelante, necesitamos saber si el objeto Date es una fecha o fecha y hora.

18/05/05 00:00:00 y 05/18: 05 ambos tienen la porción de hora/minuto. Realmente no puedo distinguirlos.

+0

Por curiosidad, ¿no tiene Java una forma de comparar diferentes formatos de fecha? Esto es trivialmente fácil en .NET. – Jason

+0

'Calendario c = Calendar.getInstance(); Fecha x; // lleno con algunos datos ' ' c.setTime (x); c.get (Calendar.YEAR) // o el campo que desea' –

+0

@Jason "formatos de fecha" en java son para renderizar/analizar. Las fechas son solo una larga lista de millis desde 1970, que puedes comparar. Las fechas no tienen un formato, están formateadas por un objeto DateFormat. – Bohemian

Respuesta

3

Un java.util.Date es, de hecho, un punto en el tiempo, no una fecha, por lo que no hay forma de usarlo como una fecha solamente. Tendrá que idear un enfoque diferente.

+0

Sí. El enfoque es defectuoso. Necesitamos tener un objeto diferente para fecha y fecha y hora. – thinkanotherone

+0

No puedo creer que esto haya sido marcado como la mejor respuesta. No es una solución, solo una opinión – FiruzzZ

0

Posiblemente pueda usar la biblioteca Google's DateTime para la validación.

Tiene los métodos parseDateTime y parseDate que lanzarán NumberFormatException si no están formateados correctamente.

Entonces, se podría hacer ...

try { 
    DateTime someVar = DateTime.parseDate("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date... 
} 

try { 
    DateTime someVar = DateTime.parseDateTime("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date/time... 
} 
+0

¡Debe evitar el uso de excepciones para el control de flujo! – Bohemian

+0

@Bohemian - ¿eh? ¿Por qué no? –

+0

De hecho, al trabajar con la entrada del usuario (es decir, cuadros de texto en un formulario web) donde debe validar si el usuario ha proporcionado una fecha correctamente, usar un analizador en la entrada proporcionada sería la única forma en que estoy consciente de validarlo ... –

0

entiendo que en realidad estás tratar con java.sql.Date y java.sql.Timestamp casos como los obtenidos a partir de un JDBC ResultSet que hayan sido declaradas en contra de su superclase java.util.Date, ¿verdad?

En ese caso, solo use instanceof.

if (date instanceof java.sql.Date) { 
    // It was originally a DATE. 
} else if (date instanceof java.sql.Timestamp) { 
    // It was originally a TIMESTAMP (DATETIME). 
} 
5

A menos que sus datetimes se garantiza que no sea a la medianoche, es decir, que nunca tienen HH:mm:ss de 00:00:00, no hay forma de sólido de decir "fechas" y datetimes que resultan ser a medianoche aparte.

Si sus datetimes nunca están a la medianoche, entonces:

if (new SimpleDateFormat("HH:mm:ss").format(object).equals("00:00:00")) 

podría hacer para determinar si el objeto Date es una "fecha".

Creo que su diseño es defectuoso y debería encontrar otra solución. También creo que el nombre de la clase Date es defectuoso y causa este tipo de confusión.

+0

'" 00:00:00 ".equals (nuevo SimpleDateFormat (" hh: mm: ss "). formato (objeto));' – rptmat57

+0

@rpt ¿Cuál es su punto? – Bohemian

+0

es mejor practicar tener literales de cadenas en el otro lado. aunque no creo que el método de formateo devuelva nulo – rptmat57

0

Aunque estoy de acuerdo con las soluciones publicadas aquí con respecto al modding del valor de tiempo sin procesar para ver si tiene una porción de tiempo, como dijo Dmitri, la falla es que si el valor Date tiene una porción de tiempo exactamente de la medianoche, no hay forma decir.

Así que, pensando un poco lateralmente aquí, es de suponer que podría crear su propia clase que extienda Date que tiene una variable miembro booleana llamada "isDateTime". Luego, cuando cargue inicialmente su fecha o valor de fecha y hora, configure ese valor booleano en verdadero o falso, dependiendo de si se trata de una fecha o no.

3

Uso commons-lang-3 Apache: bibliotecas 3 partes

DateUtils.truncate(fecha, Calendar.DAY_OF_MONTH).equals(fecha) 
1

No hay necesidad de análisis, formato o. Puede hacerlo fácilmente:

Calendar c = ... 
c.setTime(date); 
//this doesn't care about nanos 
if(c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) > 0) { 
.... 
} 

PD: Lo hago con 1000-1025.000 objetos y no parece poner en peligro el rendimiento, pero, por supuesto, todo dependerá de dónde y por qué desea hacer esto

+0

¿Es este enfoque más efectivo o compara la porción de tiempo como 'String' que describe _Bohemian_? – dk7

+1

Como dije, este "enfoque" no necesita un SimpleDateFormat (que no es un ** objeto barato ** que se creará si va a hacer muchas veces la comparación), también SDF no es Thread Safe, por lo que dependiendo el contexto (multi-hilo) puede fallar y algunas razones más que están fuera del tema – FiruzzZ

Cuestiones relacionadas