什么是解析可在下列格式Java日期格式允许 - /或。如日期
"dd-MM-yyyy HH:mm"
"dd/MM/yyyy HH:mm"
"dd.MM.yyyy HH:mm"
一个,而无需创建3个SimpleDateFormats和分析对每一个日期的最好方式中的分隔符。
感谢
什么是解析可在下列格式Java日期格式允许 - /或。如日期
"dd-MM-yyyy HH:mm"
"dd/MM/yyyy HH:mm"
"dd.MM.yyyy HH:mm"
一个,而无需创建3个SimpleDateFormats和分析对每一个日期的最好方式中的分隔符。
感谢
这可能比较容易“调整”的源字符串转换为规范的格式:
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);
}
}
然后用使用格式字符串“ - ”。
注意,这是非常具体的,只有更换正是你感兴趣的人物,以避免不必要的副作用。
ParseExact可以采取的形式的阵列。您仍然需要指定所有格式,但这只是一项操作。
这是一个Java的问题,还没有一个parseExact方法 – Tarski 2009-09-18 09:35:16
这不是SimpleDateFormat的的方法,或标准用于Java方法的情况。你是否引用C#或类似? – 2009-09-18 09:36:45
对不起,我的错。是的,这就是C#。 – 2009-09-19 23:28:45
您可以使用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,但什么不好呢?
如何对正则表达式:
"\\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));
}
因为\是Java字符串文字的转义字符,你必须加倍每个\:“\\ d \\ d [\\/\\ - ] \\ \\ d d [\\。\ \/\\ - ] \\ \\ d \\ d \\ d \\ d \\ d d:\\ \\ d d” – Jesper 2009-09-18 09:49:47
你错了 - 你仍然需要写 “在\\ d” 你Java源代码,无论这是否是正则表达式。 – Jesper 2009-09-18 10:06:41
现在我不得不去检查一下,你是完全正确的先生。这真是丑陋,他们可以很容易地使用另一个逃生角色。 – NomeN 2009-09-18 10:23:12
自己用正则表达式做它:
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”将被允许。
谢谢,我会开始对通用的日期解析器为我们的代码库,这将是一个良好的开端 – Tarski 2009-09-18 09:51:52