2010-06-24 29 views
12

Quiero validar y analizar las fechas usando un formato de fechaFácil simple con el formato "aaaammdd" Esto también permite 100624, que se analiza hasta el año 10 (54 años después de la muerte de Julio César). Las fechas también serán algo así como 1970, así que no quiero conformarme con SimpleDateFornat ("yymmdd").forzando 4 dígitos año en el formato simple de Java

Me pregunto si hay alguna manera de forzar un formato de cuatro dígitos con SimpleDateFormat. Estoy cerca de hacer una prueba de expresión regular por adelantado, pero tal vez haya una forma inteligente de usar el (simple) DateFormat()?

Como solicité el código, las cosas se complican cada vez más y mi investigación fue la mitad. El formato utilizado fue aaaa-MM-dd para empezar (provenía de una variable que tenía un javadoc incorrecto). Sin embargo, como se indica en una respuesta debajo de aaaaMMdd, fuerza un dígito de cuatro años. Así que mi pregunta cambia a Cómo forzar un año de cuatro dígitos para el formato "aaaa-MM-dd". ¿Y por qué "yyyyMMdd" se comporta diferente?

public void testMaturity() { 
    try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf.format(sdf.parse("40-12-14"))); 
     SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf2.format(sdf2.parse("401214"))); 
     fail(); 
    } catch (ParseException pe) { 
     assertTrue(true); 
    } 

que imprime 0040-12-14

+0

Si la fecha requiere aaaammdd entonces el año 10 sería 0010.No veo ningún problema con esto, no les permite ingresar 1 para el primer día (01) o el primer mes, entonces, ¿por qué permitirlo durante años? – Goibniu

Respuesta

3

Sólo tiene que utilizar yyyyMMdd (nota:! M mayúscula se utiliza para indicar el mes, de lo contrario you're parsing minutes) y compruebe si el año es mayor alguna fecha de corte (para Por ejemplo, cuando se analizan las fechas de nacimiento, un 1800 mayor es una apuesta segura, cuando las fechas de análisis para las fechas ascendentes mayores o iguales al año actual serían buenas).

2

Hmm. Sospecho que usted debe utilizar "MM" en lugar de "mm" para empezar ... pero "100624" no analiza todos modos cuando lo intento - incluso en modo indulgente:

import java.util.*; 
import java.text.*; 

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     format.setLenient(true); 
     tryParse(format, "100624"); 
     format.setLenient(false); 
     tryParse(format, "100624"); 
    } 

    static void tryParse(DateFormat format, String text) 
    { 
     try 
     { 
      Date date = format.parse(text); 
      System.out.println("Parsed " + text + " to " + date); 
     } 
     catch (ParseException pe) 
     { 
      System.out.println("Failed to parse " + text); 
     } 
    } 
} 

(e incluso utilizando "mm" en lugar de "mM" que todavía no puede analizar)

Lienzo:.

Failed to parse 100624 
Failed to parse 100624 

Tal vez podría mostrar el código que es gestión para analizar esto?

+0

Gracias! Agregué un código para probar y descubrí que formatString no era como se esperaba y que yyyyMMdd obliga a un requisito de 4 dígitos del año. Sigue siendo típico que aaaa-MM-dd se comporte de manera diferente. –

2

Intente llamar al setLenient(false); en el objeto SimpleDateFormat, que lo hará usar reglas más estrictas para el análisis (de lo contrario, intentará ser "inteligente" si la cadena de entrada no coincide exactamente con el formato). Por ejemplo:

DateFormat df = new SimpleDateFormat("yyyyMMdd"); 
df.setLenient(false); 

Y por supuesto, es MM meses, no mm.

1

No hay una manera fácil de hacerlo. Si está diciendo que las fechas pueden ser como 1970, la pregunta principal sería qué significa 700624: ¿1970 o 2070? Debería implementar una fecha de corte como la propuesta por Joachim o pasar a 4 dígitos por año.

1

Bueno, es bastante directo y directo. Siga estos sencillos pasos:

Paso 1:

try { 
    String dates = "40-12-14"; 
    String patterns = "yy-MM-dd"; 
    SimpleDateFormat format3 = new SimpleDateFormat(patterns);`` 
    java.util.Date dates1 = format3.parse(dates); 

    SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy"); 

    String strDate1 = sdfDate.format(dates1); 
    System.out.println("Date1: " + strDate1); 

} 
catch(ParseException e){ 
    e.printStackTrace(); 
} 

Esta es la salida:

Date1: 14/12/1940 
Cuestiones relacionadas