我有以下字符串,其中包含多个日期;像这样的东西:
I was born on 8/11/1965.
我需要将所有日期更改为其他格式。
实现这一目标的最佳方法是什么?
注意:
我没有让别人给我代码;只是征求意见;因此无法看出任何负面评价的原因。
答案 0 :(得分:2)
这是完整的算法。
Pattern ddpat = Pattern.compile( "\\d{1,2}/\\d{1,2}/\\d{4}" );
DateFormat dddf = new SimpleDateFormat("dd/MM/yyyy");
DateFormat wwdf = new SimpleDateFormat("EEEE, MMMM d yyyy");
String s = "I was born on 18/11/1965. and completed my grad on 9/10/1978 and so on";
StringBuilder sb = new StringBuilder();
Matcher ddmat = ddpat.matcher( s );
int offset = 0;
while( ddmat.find( offset ) ){
int beg = ddmat.start();
int end = ddmat.end();
String dd = s.substring( beg, end );
String ww = wwdf.format( dddf.parse( dd ) );
sb.append( s.substring( offset, beg ) ).append( ww );
offset = end;
}
sb.append( s.substring( offset ) );
System.out.println( sb.toString() );
要处理99/99/9999和类似,请在dddf.parse(dd)之后处理ParseException并替换为您认为合适的任何内容。不匹配正则表达式的字符串是没有希望的,除非你能想到匹配“假日期”的正则表达式。 ; - )
<强>后来强>
如果你想钓几种格式:
Pattern ddpat = Pattern.compile( "(\\d{1,2}/\\d{1,2}/\\d{4})|(\\d{4}-\\d{2}-\\d{2})" );
DateFormat[] dddf = new DateFormat[]{
new SimpleDateFormat("dd/MM/yyyy"),
new SimpleDateFormat("yyyy-MM-dd") };
DateFormat wwdf = new SimpleDateFormat("EEEE, MMMM d yyyy");
String s = "I was born on 18/11/1965. and completed my grad on 1978-10-09 and so on";
StringBuilder sb = new StringBuilder();
Matcher ddmat = ddpat.matcher( s );
int offset = 0;
while( ddmat.find( offset ) ){
for( int ig = 1; ig <= ddmat.groupCount(); ig++ ){
if( ddmat.group(ig) != null ){
int beg = ddmat.start(ig);
int end = ddmat.end(ig);
String dd = s.substring( beg, end );
String ww = wwdf.format( dddf[ig-1].parse( dd ) );
sb.append( s.substring( offset, beg ) ).append( ww );
offset = end;
break;
}
}
}
sb.append( s.substring( offset ) );
System.out.println( sb.toString() );
答案 1 :(得分:1)
如果我了解您的目标,我能想到的最简单的方法是使用两个SimpleDateFormat
个实例。一个用于输入格式,一个用于输出格式。就是这样的 -
String str = "8/11/1965";
DateFormat in = new SimpleDateFormat("dd/MM/yyyy");
DateFormat out = new SimpleDateFormat("EEEE, MMMM dd yyyy");
System.out.println(out.format(in.parse(str)));
输出是(因为1965年11月8日是星期一不星期三) -
Monday, November 08 1965
$ cal 11 1965
November 1965
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30