2009-09-18 27 views

Trả lời

4

Có lẽ đơn giản nhất để "tinh chỉnh" chuỗi nguồn sang một định dạng kinh điển:

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

Sau đó sử dụng chuỗi định dạng sử dụng "-".

Lưu ý rằng điều này rất cụ thể, chỉ thay thế chính xác các ký tự bạn quan tâm, để tránh các tác dụng phụ không mong muốn.

+0

Cảm ơn, tôi sẽ bắt đầu làm việc trên một trình phân tích cú pháp chung cho cơ sở mã của chúng tôi và đây sẽ là một khởi đầu tốt – Tarski

5

Trước tiên bạn có thể chạy hai hoạt động thay thế để bạn giảm cả ba định dạng thành một đơn?

+0

Ah .. tôi không thấy cái này trước khi đăng câu trả lời của mình +1. tuyệt quá! – vpram86

-3

ParseExact có thể có một loạt các định dạng. Bạn vẫn phải chỉ định tất cả các định dạng, nhưng đó là một thao tác đơn lẻ.

+2

Đây là một câu hỏi Java, không có phương thức parseExact – Tarski

+0

đó không phải là phương thức của SimpleDateFormat hoặc tiêu chuẩn trường hợp cho một phương thức Java. Bạn đang tham chiếu C# hoặc tương tự? –

+0

Xin lỗi, sai lầm của tôi. Vâng, đó là C#. –

4

Bạn có thể sử dụng 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)); 
    } 
} 
} 

Vâng, nội nó tạo ra SimpleDateFormats, nhưng whats sai với điều đó?

1

thế nào về một regex:

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

Trong mã này có nghĩa là một cái gì đó như thế này:

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

Vì \ là ký tự thoát trong các chuỗi ký tự chuỗi Java, bạn phải nhân đôi mỗi \: "\\ d \\ d [\\. \\/\\ -] \\ d \\ d [\\. \ \/\\ -] \\ d \\ d \\ d \\ d \\ d \\ d: \\ d \\ d " – Jesper

+0

Bạn bị nhầm - bạn vẫn cần viết" \\ d "trong Mã nguồn Java, bất kể đây có phải là biểu thức chính quy hay không. – Jesper

+0

Bây giờ tôi phải đi kiểm tra, bạn hoàn toàn đúng. Đó là xấu xí như địa ngục, họ có thể dễ dàng như vậy chỉ cần sử dụng một nhân vật thoát khác. – NomeN

0

Làm nó cho mình với một biểu thức chính quy:

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

Lưu ý tuy nhiên đó điều này cho phép trộn các máy tách khác nhau, ví dụ "17-09/2009 12:00" sẽ được cho phép.

+0

Tôi gọi là trộm cắp trắng trợn của khái niệm ;-), bạn sẽ thấy rằng tôi đã làm việc trong việc kiểm tra dấu phân cách khác nhau với nỗ lực không nhiều. – NomeN

+0

Và dường như bạn không cần phải thoát khỏi bất kỳ nhân vật nào ở giữa [], thậm chí không phải là khoảng thời gian. – NomeN