2009-09-18 7 views

Odpowiedz

4

To chyba najłatwiejszy do „dostrojenia” ciąg źródłowy w formacie kanonicznym:

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); 
    } 
} 

Następnie użyj ciąg formatu przy użyciu „-”.

Należy zauważyć, że jest to bardzo specyficzne, zastępując jedynie dokładnie znakami, którymi jesteś zainteresowany, aby uniknąć niepożądanych efektów ubocznych.

+0

Dzięki, zacznę pracować nad ogólnym parserem dat dla naszej bazy kodu i będzie to dobry początek – Tarski

5

można uruchomić dwa zastąpić operacje pierwszy, dzięki czemu można zmniejszyć wszystkich trzech formatów do jednego jeden?

+0

Ah .. nie widziałem tego przed opublikowaniem mojej odpowiedzi +1. wspaniały! – vpram86

-3

ParseExact może przyjmować wiele formatów. Nadal musisz określić wszystkie formaty, ale jest to pojedyncza operacja.

+2

To jest pytanie Java, nie ma metody parseExact – Tarski

+0

, która nie jest metodą SimpleDateFormat lub standardowego case dla metody Java. Czy odwołujesz się do języka C# lub podobnego? –

+0

Przepraszam, mój błąd. Tak, to jest C#. –

4

Można użyć 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)); 
    } 
} 
} 

Well, wewnętrznie tworzy SimpleDateFormats, ale co jest w tym złego?

1

jak o regex:

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

W kodzie oznaczałoby to mniej więcej tak:

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

Ponieważ \ jest znakiem escape w literałach napisanych w języku Java, musisz podwoić każdy \: "\ \ d \\ d [\\. \\/\\ -] \\ d \\ d [\\. \ \/\\ -] \\ d \\ d \\ d \\ d: \\ d \\ d " – Jesper

+0

Mylisz się - nadal musiałbyś napisać" \\ d "w swoim Kod źródłowy Java, niezależnie od tego, czy jest to wyrażenie regularne czy nie. – Jesper

+0

Teraz musiałem iść i sprawdzić, masz absolutną rację, proszę pana. To brzydkie jak diabli, mogli tak łatwo wykorzystać inną postać ucieczki. – NomeN

0

siebie robi to z wyrażenia regularnego:

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); 
     } 
    } 
} 

Należy jednak pamiętać, że to pozwala mieszać różne separatory, np "17-09/2009 12:00" będzie dozwolone.

+0

Wzywam do rażącego kradzieży koncepcji ;-), zobaczysz, że pracowałem przy różnych sprawdzeniach separatora bez większego wysiłku. – NomeN

+0

I najwyraźniej nie musisz uciekać od żadnych znaków pomiędzy [], nawet okresu. – NomeN