2009-09-18 10 views

Respuesta

4

Es probable que sea más fácil de "ajustar" la cadena de origen en un formato canónico:

if (text.length() == 16) 
{ 
    if ((text.charAt(2) == '/' && text.charAt(5) == '/') || 
     (text.charAt(2) == '.' && text.charAt(5) == '.')) 
    { 
     text = text.substring(0, 2) + "-" + text.substring(3, 5) 
      + "-" + text.substring(6); 
    } 
} 

A continuación, utilice la cadena de formato usando "-".

Tenga en cuenta que esto es muy específico, solo reemplaza exactamente los caracteres que le interesan, para evitar efectos secundarios no deseados.

+0

Gracias, voy a empezar a trabajar en un analizador genérico de fechas para nuestro código base y este será un buen comienzo – Tarski

5

Podría ejecutar dos operaciones reemplazar en primer lugar, de manera que se reduce a los tres formatos de una sola?

+0

Ah ... no vi este antes de publicar mi respuesta +1. ¡estupendo! – vpram86

-3

ParseExact puede tomar una variedad de formatos. Aún debe especificar todos los formatos, pero es una operación única.

+2

Esta es una pregunta de Java, no hay un método parseExact – Tarski

+0

que no sea un método de SimpleDateFormat, o el estándar caso para un método de Java. ¿Estás haciendo referencia a C# o similar? –

+0

Lo siento, mi error. Sí, eso es C#. –

4

Es posible utilizar Apache commons lang DateUtils.parseDate

import java.text.ParseException; 
import org.apache.commons.lang.time.DateUtils; 

public class Test { 

public static void main(String[] args) throws ParseException { 

    String[] values = new String[]{"31-12-2009 12:00", "31/12/2009 12:00", "31.12.2009 12:00"}; 
    String[] parsePatterns = new String[]{"dd-MM-yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd.MM.yyyy HH:mm"}; 

    for (String value : values) { 
     System.out.println(DateUtils.parseDate(value, parsePatterns)); 
    } 
} 
} 

Bueno, internamente crea SimpleDateFormats, pero es malo en eso?

1

¿qué tal una expresión regular:

"\\d\\d[./-]\\d\\d[./-]\\d\\d\\d\\d \\d\\d:\\d\\d" 

En el código, esto significaría algo como esto:

Pattern pattern = 
Pattern.compile("(\\d\\d)([./-])(\\d\\d)([./-])(\\d\\d\\d\\d) (\\d\\d):(\\d\\d)"); 

Matcher matcher = 
pattern.matcher("31-07-1983 15:30"); 

if (matcher.find() && matcher.group(2).equals(matcher.group(4))) { 
    int day = Integer.parseInt(matcher.group(1)); 
    int month = Integer.parseInt(matcher.group(3)); 
    int year = Integer.parseInt(matcher.group(5)); 
    int hour = Integer.parseInt(matcher.group(6)); 
    int minute = Integer.parseInt(matcher.group(7)); 
} 
+0

Como \ es un carácter de escape en los literales de cadenas Java, debe duplicar cada \: "\\ d \\ d [\\. \\/\\ -] \\ d \\ d [\\. \ \/\\ -] \\ d \\ d \\ d \\ d \\ d \\ d: \\ d \\ d " – Jesper

+0

Está equivocado, aún tendría que escribir" \\ d "en su Código fuente de Java, independientemente de si esta es una expresión regular o no. – Jesper

+0

Ahora tenía que ir y comprobar, usted tiene toda la razón señor. Eso es feo como el infierno, podrían haber usado tan fácilmente otro personaje de escape. – NomeN

0

lo hace usted mismo con una expresión regular:

public class SpecialDateFormat 
{ 
    private final static Pattern PATTERN = Pattern.compile("(\\d{2})[\\.\\/\\-](\\d{2})[\\.\\/\\-](\\d{4}) (\\d{2}):(\\d{2})"); 

    public static Date parse(String text) throws ParseException { 
     Matcher m = PATTERN.matcher(text); 
     if (m.matches()) { 
      int dd = Integer.parseInt(m.group(1)); 
      int mm = Integer.parseInt(m.group(2)); 
      int yy = Integer.parseInt(m.group(3)); 
      int hh = Integer.parseInt(m.group(4)); 
      int mi = Integer.parseInt(m.group(5)); 

      // NOTE: Checking if values are in valid ranges omitted 

      Calendar cal = Calendar.getInstance(); 
      cal.set(yy, mm - 1, dd, hh, mi, 0); 

      return cal.getTime(); 
     } 
     else { 
      throw new ParseException("Unparseable date: " + text, 0); 
     } 
    } 
} 

Nota sin embargo, que esto permite mezclar diferentes separadores, por ejemplo "17-09/2009 12:00" estaría permitido.

+0

Llamo el robo flagrante de concepto ;-), verás que he trabajado en las diferentes comprobaciones de separadores sin mucho esfuerzo. – NomeN

+0

Y aparentemente no es necesario que escapes ninguno de los caracteres entre [], ni siquiera el punto. – NomeN

Cuestiones relacionadas