如何判别输入的字符串符合日期规范“YYYYMMDDHH”,麻烦各位大虾了。在线等
如何判别输入的字符串符合日期规范“YYYYMMDDHH”,麻烦各位大虾了。在线等
问题点数:0、回复次数:25Top
1 楼xitianjile(空想社會主義)回复于 2005-02-03 12:41:24 得分 0
比如mm准确到要准确到1-12吗?Top
2 楼qybao(阿宝)回复于 2005-02-03 12:53:30 得分 0
you can use calendar class to check it
int yy = Integer.parseInt(your_string.substring(0,4));
int mm = Integer.parseInt(your_string.substring(4,6));
int dd = Integer.parseInt(your_string.substring(6,8));
int hh = Integer.parseInt(your_string.substring(8,10));
Calendar c = new GregorianCalendar(yy,mm-1,dd,hh,0,0);
if (c.get(Calendar.YEAR) != yy || c.get(Calendar.MONTH) != mm-1 || c.get(Calendar.DAY) != dd || c.get(Calendar.HOUR) != hh) {
return false;
}
return true;Top
3 楼czhhua28(风之子)回复于 2005-02-03 13:05:37 得分 0
同意楼上的Top
4 楼zcjl()回复于 2005-02-03 13:19:54 得分 0
String date = "2005020313";
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHH");
fmt.setLenient(false);
try {
fmt.parse(date);
} catch (ParseException e) {
//不符合日期格式
e.printStackTrace();
}Top
5 楼yrsheng(以德服人)回复于 2005-02-03 13:26:17 得分 0
String dateString = "2005010213";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");
Date date = sdf.parse(dateString);//在此捕捉异常,如果有,则字符串格式不对
Top
6 楼darkfly1(飞火)回复于 2005-02-04 15:45:36 得分 0
用正则表达式Top
7 楼cooltigerzsh(阿波罗)回复于 2005-02-04 15:52:39 得分 0
正则表达式
function validateDate(form) {
var bValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
oDate = new DateValidations();
for (x in oDate) {
var value = form[oDate[x][0]].value;
var datePattern = oDate[x][2]("datePatternStrict");
if ((form[oDate[x][0]].type == 'text' ||
form[oDate[x][0]].type == 'textarea') &&
(value.length > 0) &&
(datePattern.length > 0)) {
var MONTH = "MM";
var DAY = "dd";
var YEAR = "yyyy";
var orderMonth = datePattern.indexOf(MONTH);
var orderDay = datePattern.indexOf(DAY);
var orderYear = datePattern.indexOf(YEAR);
if ((orderDay < orderYear && orderDay > orderMonth)) {
var iDelim1 = orderMonth + MONTH.length;
var iDelim2 = orderDay + DAY.length;
var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
if (iDelim1 == orderDay && iDelim2 == orderYear) {
dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
} else if (iDelim1 == orderDay) {
dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
} else if (iDelim2 == orderYear) {
dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
} else {
dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
}
var matched = dateRegexp.exec(value);
if(matched != null) {
if (!isValidDate(matched[2], matched[1], matched[3])) {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
} else {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
} else if ((orderMonth < orderYear && orderMonth > orderDay)) {
var iDelim1 = orderDay + DAY.length;
var iDelim2 = orderMonth + MONTH.length;
var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
if (iDelim1 == orderMonth && iDelim2 == orderYear) {
dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
} else if (iDelim1 == orderMonth) {
dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
} else if (iDelim2 == orderYear) {
dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
} else {
dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
}
var matched = dateRegexp.exec(value);
if(matched != null) {
if (!isValidDate(matched[1], matched[2], matched[3])) {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
} else {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
} else if ((orderMonth > orderYear && orderMonth < orderDay)) {
var iDelim1 = orderYear + YEAR.length;
var iDelim2 = orderMonth + MONTH.length;
var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
if (iDelim1 == orderMonth && iDelim2 == orderDay) {
dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
} else if (iDelim1 == orderMonth) {
dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
} else if (iDelim2 == orderDay) {
dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
} else {
dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
}
var matched = dateRegexp.exec(value);
if(matched != null) {
if (!isValidDate(matched[3], matched[2], matched[1])) {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
} else {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
} else {
if (i == 0) {
focusField = form[oDate[x][0]];
}
fields[i++] = oDate[x][1];
bValid = false;
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join('\n'));
}
return bValid;
}Top
8 楼labrun(labrun)回复于 2005-02-04 17:38:28 得分 0
路上的怎么把javascript也搬出来了?Top
9 楼labrun(labrun)回复于 2005-02-04 17:43:03 得分 0
SimpleDateFormat的parse方法最方便,但是如何使yyyyMMddHH这里面的HH必须是2位数,
比如2005020401可以,但200502041就不行呢?Top
10 楼soulcy(棋子)回复于 2005-02-04 18:02:23 得分 0
同意4、5楼Top
11 楼yagumo(八云)回复于 2005-02-04 18:11:55 得分 0
正则表达式,王道.Top
12 楼shan1119(大天使,卐~解!)回复于 2005-02-04 18:30:42 得分 0
ffTop
13 楼86867651(顶怪王)回复于 2005-02-04 18:56:08 得分 0
8错,长见识Top
14 楼cxz7531(大花猫)回复于 2005-02-04 21:09:02 得分 0
最好用捕捉异常
import java.util.*;
public class formular {
public static void main(String[] args) {
System.out.println(isvaliedate("2004022918"));
}
public static boolean isvaliedate(String timestr) {
if (timestr.length() != 10)
return false;
int y, m, d, h, yy, mm, dd, hh;
try {
y = Integer.parseInt(timestr.substring(0, 4));
m = Integer.parseInt(timestr.substring(4, 6)) - 1;
d = Integer.parseInt(timestr.substring(6, 8));
h = Integer.parseInt(timestr.substring(8, 10));
} catch (NumberFormatException e) {
return false;
}
Calendar dt = Calendar.getInstance();
dt.clear();
dt.set(y, m, d, h, 0, 0);
yy = dt.get(Calendar.YEAR);
mm = dt.get(Calendar.MONTH);
dd = dt.get(Calendar.DATE);
hh = dt.get(Calendar.HOUR);
if (dt.get(Calendar.AM_PM) == Calendar.PM)
hh += 12;
if (yy != y || mm != m || dd != d || hh != h) {
return false;
}
return true;
}
}Top
15 楼fogs(菜鸟想飞)回复于 2005-02-04 21:16:30 得分 0
建议不使用SimpleDateFormat,使用Calendar,很好用Top
16 楼qqbz(qqbz)回复于 2005-02-05 10:29:36 得分 0
得到日期后,你转换为要求的格式不就可以了。Top
17 楼zcjl()回复于 2005-02-05 13:09:02 得分 0
回复人: labrun(labrun) ( ) 信誉:100 2005-02-04 17:43:00 得分: 0
SimpleDateFormat的parse方法最方便,但是如何使yyyyMMddHH这里面的HH必须是2位数,
比如2005020401可以,但200502041就不行呢?
-----------------------
我前面的回复中有啊,加上这么一句:
fmt.setLenient(false);Top
18 楼zcjl()回复于 2005-02-05 13:09:36 得分 0
回复人: fogs(菜鸟想飞) ( ) 信誉:100 2005-02-04 21:16:00 得分: 0
建议不使用SimpleDateFormat,使用Calendar,很好用
------------------------
why?请问SimpleDateFormat有什么不妥么?Top
19 楼zcjl()回复于 2005-02-05 13:24:07 得分 0
回复人: labrun(labrun) ( ) 信誉:100 2005-02-04 17:43:00 得分: 0
SimpleDateFormat的parse方法最方便,但是如何使yyyyMMddHH这里面的HH必须是2位数,
比如2005020401可以,但200502041就不行呢?
-----------------------
最近老眼昏花,老是看错,真不好意思
对于你的要求,setLenient()方法也不行Top
20 楼flyxxxxx()回复于 2005-02-05 13:47:21 得分 0
捕获异常是极其消耗资源的
用捕获异常来进行判断是异常的一种错误用法,在这里正确的方法是用正则表达式或自己分析(同样不能用捕获Integer.parseInt()的方式进行,而是应该先看这个字符串是不是全是数字s.char(i)在字符'0'到'9'之间)
Top
21 楼cxz7531(大花猫)回复于 2005-02-05 14:11:29 得分 0
to 楼上
------------
“捕获异常是极其消耗资源”???我自己编写过异常类,只不过是在特定条件下抛出异常,捕捉后判断是什么原因而已Top
22 楼apollo333()回复于 2005-02-06 23:41:13 得分 0
关注。Top
23 楼away5678(超人Advance)回复于 2005-02-07 12:19:31 得分 0
学到东西Top
24 楼angues1980(石头心)(JSF学习中)回复于 2005-02-07 22:46:02 得分 0
如果是文本框的话,可以用JFormattedTextField一开始就阻止用户输入非法的数值啊!Top
25 楼zdnetchina(天天向上)回复于 2005-02-08 00:52:08 得分 0
studyTop




