2009-09-18 48 views
5

什么是解析可在下列格式Java日期格式允许 - /或。如日期

"dd-MM-yyyy HH:mm" 
"dd/MM/yyyy HH:mm" 
"dd.MM.yyyy HH:mm" 

一个,而无需创建3个SimpleDateFormats和分析对每一个日期的最好方式中的分隔符。

感谢

回答

4

这可能比较容易“调整”的源字符串转换为规范的格式:

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

然后用使用格式字符串“ - ”。

注意,这是非常具体的,只有更换正是你感兴趣的人物,以避免不必要的副作用。

+0

谢谢,我会开始对通用的日期解析器为我们的代码库,这将是一个良好的开端 – Tarski 2009-09-18 09:51:52

5

你可以运行两个第一替换操作,让你减少这三种格式的单呢?

+0

啊..我因此未看到这一个发布我的回答+1之前。大! – vpram86 2009-09-18 10:04:55

-3

ParseExact可以采取的形式的阵列。您仍然需要指定所有格式,但这只是一项操作。

+2

这是一个Java的问题,还没有一个parseExact方法 – Tarski 2009-09-18 09:35:16

+0

这不是SimpleDateFormat的的方法,或标准用于Java方法的情况。你是否引用C#或类似? – 2009-09-18 09:36:45

+0

对不起,我的错。是的,这就是C#。 – 2009-09-19 23:28:45

4

您可以使用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)); 
    } 
} 
} 

那么,在内部它创建SimpleDateFormats,但什么不好呢?

1

如何对正则表达式:

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

在代码中,这将意味着是这样的:

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

因为\是Java字符串文字的转义字符,你必须加倍每个\:“\\ d \\ d [\\/\\ - ] \\ \\ d d [\\。\ \/\\ - ] \\ \\ d \\ d \\ d \\ d \\ d d:\\ \\ d d” – Jesper 2009-09-18 09:49:47

+0

你错了 - 你仍然需要写 “在\\ d” 你Java源代码,无论这是否是正则表达式。 – Jesper 2009-09-18 10:06:41

+0

现在我不得不去检查一下,你是完全正确的先生。这真是丑陋,他们可以很容易地使用另一个逃生角色。 – NomeN 2009-09-18 10:23:12

0

自己用正则表达式做它:

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

然而要注意这确实允许混合不同的分隔符,例如“17-09/2009 12:00”将被允许。

+0

我称之为公然窃取的概念;-),你会看到我已经在不同的分隔符检查中工作了很多功夫。 – NomeN 2009-09-18 10:29:49

+0

而且显然你不需要转义[]之间的任何字符,甚至不需要这段时间。 – NomeN 2009-09-18 10:32:26