最好用什么方法判断一个字符串是不是日期?(50分)

  • 主题发起人 主题发起人 Sterntaler
  • 开始时间 开始时间
S

Sterntaler

Unregistered / Unconfirmed
GUEST, unregistred user!
import java.text.SimpleDateFormat;
public class IsDate{
public static void main(String[] args) throws Exception{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.print(sdf.parse("22342423-222234-2234234"));
}
}
输出的结果:
Sat Jul 16 00:00:00 CST 22367059
我想到用正则表达式先判断日期字符串的格式,然后再判断数值是否合法,这样肯定行,就是太复杂。
 
用:
try
StrToDateTime(myDateTime);
except
//出错表示不合法
end;
 
我竟然为了判断是不是日期,用了这么复杂的代码!谁给我个简单的建议啊。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.PatternSyntaxException;
public class IsDate{
public static void main(String[] args) throws Exception{
boolean is_date = isDate("1000-2-29");
System.out.println(is_date);
}

public static boolean isDate(String strDate){
try {
Pattern datePattern = Pattern.compile("([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})");
Matcher dateParts = datePattern.matcher(strDate);
if (dateParts.find()){
int iYear = getIntValue(dateParts.group(1));
int iMonth = getIntValue(dateParts.group(2));
int iDay = getIntValue(dateParts.group(3));

if (checkDate(iYear, iMonth, iDay)) return true;
else
return false;
} else
return false;
} catch (PatternSyntaxException pse){ return false;
}
}

public static boolean checkDate(int iYear, int iMonth, int iDay){
int[] amonths = {1, 3, 5, 7, 8, 10, 12};
int[] bmonths = {4, 6, 9, 11};
for (int i = 0;
i < amonths.length;
i++)
if (iMonth == amonths &amp;&amp;
iDay < 32) return true;
for (int i = 0;
i < bmonths.length;
i++)
if (iMonth == bmonths &amp;&amp;
iDay < 31) return true;
if (iMonth ==2){
if (isLeapYear(iYear) &amp;&amp;
iDay < 30) return true;
else
if (iDay < 29) return true;
}
return false;
}

public static boolean isLeapYear(int iYear){
if (iYear % 4 == 0){
if ((iYear % 100 == 0) &amp;&amp;
(iYear % 400 != 0)) return false;
else
return true;
} else
return false;
}

public static int getIntValue(String strInt){
try {
return Integer.parseInt(strInt);
} catch (Exception e){ return 0;
}
}
}
 
但是我想要的是简单一点的Java的解决方案。
 
看看delphi里的DateUtils单元吧。
 
这个日期肯定是用户提交的罗。那就用javaScript不久行了,何必用java代码。
 
同意fdlsoft
 
:流浪者888
你肯定?错啦,这次我可是从上传过来的文件里面读取的。
 
delphiers: 我的服务器是Linux + Tomcat
 
[JDK 类库] 里面有没有判断 [一个字符串] 是不是 [日期] 方法?

能用一两行语句实现也算, 越简单越好.
 
public static int DataCheck(String strdate){
try {
int _year=Integer.parseInt(strdate.substring(0,4)) ;
int _month=Integer.parseInt(strdate.substring(4,6)) ;
int _data=Integer.parseInt(strdate.substring(6,8)) ;
Calendar cal1 = Calendar.getInstance();
cal1.setLenient(false);
cal1.set(_year,_month,_data);
System.out.print(cal1.getTime()) ;
} catch (Exception e1 ) {
System.out.print("日期格式不对");
return 2;
}
return 1;
}
还有用正则表达式来判断日期 也可以,但我没用过 你可以自己去看看
 
7syw大侠也这么不小心:
int _year=Integer.parseInt(strdate.substring(0,4)) ;
int _month=Integer.parseInt(strdate.substring(5,6)) ;
int _data=Integer.parseInt(strdate.substring(8,9)) ;
你说的正则表达式的方法, 我上面的那些代码不算吗? 我现在还在用着的,如果有错,告诉我,非常感谢.
你的方法用了 cal1.setLenient(false);
我一看也觉得正是我要找的东西, 不过试验的结果 "2100-2-29" 也合法.?? 你也看看好不好?
 
对不起 我没看你的代码。
多谢你叫我大侠,我不是什么大侠。大家共同学习把。
 
procedure TForm1.Button2Click(Sender: TObject);
var
strs:String;
year,month,day:word;
begin
Strs:='2003-12-09';
try
year:=StrToInt(copy(Strs,1,4));
month:=StrToInt(copy(Strs,6,2));
day:=StrToInt(copy(Strs,9,2));
EncodeDate(year,month,day);//将年月日合成为日期格式
MessageDlg(Strs,mtInformation,[mbok],0);
except
MessageDlg(Strs,mtError,[mbok],0);
end;
end;
 
to 7syw: 呵呵, 大侠的标准: 路见不平, 拔刀相助.
 
to Sterntaler:
哈哈 大家的都是大侠了 嘿嘿 同喜同喜
 
取笑了, 我还在等着救助呢. :(
 
// checkDate3("1000-2-29") 返回true;
不正确
public static boolean checkDate3(String strDate){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);
sdf.parse(strDate);
return true;
} catch (Exception e){ return false;
}
}

// y = 2006, m = 2, d = 29;
checkDate4(y, m, d);
返回 true. 不正确
public static boolean checkDate4(int y, int m, int d){
GregorianCalendar gc = new GregorianCalendar(y, m, d);
return (gc.get(Calendar.YEAR) == y) &amp;&amp;
(gc.get(Calendar.MONTH) == m) &amp;&amp;
(gc.get(Calendar.DAY_OF_MONTH) == d);
}
不过还是觉得checkDate3比checkDate4强一点. 但是都不准确.
 
dearhms: 用Delphi的话,还是fdlsoft的方法简单.
 
后退
顶部