请教高手们java中的字符串/日期的验证问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教高手们java中的字符串/日期的验证问题相关的知识,希望对你有一定的参考价值。

一个方法传入2个参数都是String类型的,我想比较这2个参数的大小怎么比较?Java代码.还有怎么知道格式是否正确? 就像这样(2010-8-1)这样是正确的.
还有希望大家能给一些字符串验证的代码,正则表达式那样的.十分感谢!

这是我写的一个工具类,其中里面的isLagelDateOfString方法可以检查字符串是否是合法的日期

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* 提供一些对处理日期实用的静态方法
* @author Freedom
*
*/
public class CalendarKit

/**作为键使用*/
public static final String YEAR = "year";

public static final String MONTH = "month";

public static final String DAY = "day";

/**日历的起始年份*/
public static final int START_YEAR = 1970;

/**日历的结束年份*/
public static final int END_YEAR = 2089;

/**保存文本描述的星期数*/
public static final String[] DAY_OF_WEEK = "日", "一", "二", "三", "四", "五", "六";

/**月份的文本描述*/
public static final String[] MONTHS = "一月", "二月", "三月", "四月", "五月",
"六月", "七月", "八月", "九月", "十月", "十一月", "十二月";

/**保存每个月的天数*/
public static final int[] DAYS_OF_MONTH = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;

/**
* 根据d返回一个字符串天数,如果d小于0则在前面加"0"
* @param d
* @return
*/
public static String getDayForString(int d)
return d < 10 ? "0" + d : d + "";


/**
* 根据m返回一个字符串月份,如果m小于0则在前面加"0"
* @param m
* @return
*/
public static String getMonthForString(int m)
return m < 10 ? "0" + m : m + "";


/**
* 检查year是否在有效的年份范围内
* @param year
* @return
*/
public static boolean isLagelYear(int year)
return year >= START_YEAR && year <= END_YEAR;


/**
* 检查month是否在有效的月份范围内
* @param month
* @return
*/
public static boolean isLagelMonth(int month)
return month >= 1 && month <= 12;


/**
* 检查天数是否在有效的范围内,因为天数会根据年份和月份的不同而不同
* 所以必须依赖年份和月份进行检查
* @param year
* @param month
* @param day
* @return
*/
public static boolean isLagelDay(int year, int month, int day)
if(!isLagelYear(year)) return false;
if(!isLagelMonth(month)) return false;
if(month == 2 && isLeapYear(year)) //闰年且是2月份
return day >= 1 && day <= 29;

return day >= 1 && day <= DAYS_OF_MONTH[month - 1];//其他月份


/**是否是闰年*/
public static boolean isLeapYear(int year)
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;


/**
* 判断该日期是否在有效日期范围内
* 有效日期为:1970-1-1~2089-12-31
* @param date
* @return
*/
public static boolean isLagelDate(GregorianCalendar date)
int y = date.get(Calendar.YEAR);
int m = date.get(Calendar.MONTH) + 1;
int d = date.get(Calendar.DAY_OF_MONTH);
return isLagelDay(y, m, d);


/**
* 返回date的一号是星期几
* @param date
* @return
*/
public static int getWeekForFirst(GregorianCalendar date)
int day = date.get(Calendar.DAY_OF_MONTH);//当前天
int week = date.get(Calendar.DAY_OF_WEEK) - 1;
int t = day % 7 - 1;
int weekOfFirst = week < t ? week + 7 - t : week - t;
return weekOfFirst == 7 ? 0 : weekOfFirst;


/**
* 检查以字符串形式的日期格式是否正确
* 如果正确则返回由年,月,日组成的数组
* 否则返回包含三个-1值的数组
* @param date
* @return
*/
public static int[] checkDateForString(String date)
int[] d = -1, -1, -1;
Pattern p = Pattern.compile("^\\d4-\\d1,2-\\d1,2$");
Matcher match = p.matcher(date);
if(!match.matches()) return d;
String[] str = date.split("-");
d[0] = Integer.parseInt(str[0]);
d[1] = Integer.parseInt(str[1]);
d[2] = Integer.parseInt(str[2]);
return d;


/**
* 如果该日期字符串是有效的返回true
* @param date
* @return
*/
public static boolean isLagelDateOfString(String date)
Pattern p = Pattern.compile("^\\d4-\\d1,2-\\d1,2$");
Matcher match = p.matcher(date);
return match.matches();


/**
* 根据年份和月份获取该月的总天数
* 如果年份或月份不合法,则返回-1
* @param year
* @param month
* @return
*/
public static int getDaysCount(int year, int month)
if(!isLagelYear(year) || !isLagelMonth(month))
return -1;

int d = isLeapYear(year) && month == 2 ? 1 : 0;
return d += DAYS_OF_MONTH[month - 1];


/**
* 根据年份和月份获取该月的总天数
* 如果年份或月份不合法,则返回-1
* @param date
* @return
*/
public static int getDaysCount(GregorianCalendar date)
int year = date.get(Calendar.YEAR);
int month = date.get(Calendar.MONTH) + 1;
if(!isLagelYear(year) || !isLagelMonth(month))
return -1;

int d = isLeapYear(year) && month == 2 ? 1 : 0;
return d += DAYS_OF_MONTH[month - 1];


/**
* 如果date的当前天数大于otherMonth的总天数则返回true
* 例:date = 2010-3-29 otherMonth = 2(年份也是2010)
* otherMonth的总天数只有28天,所以date的当前天数比它大
* @param date
* @param otherMonth 和date同一个年份的其他月份
* @return
*/
public static boolean daysOfCountByMonth(GregorianCalendar date, int otherMonth)
int otherDays = getDaysCount(date.get(Calendar.YEAR), otherMonth);
return date.get(Calendar.DAY_OF_MONTH) > otherDays;


/**
* 如果date的当前天数大于otherYear的总天数则返回true
* @param date
* @param otherYear 和date同一个月份的其他年份
* @return
*/
public static boolean daysOfCountByYear(GregorianCalendar date, int otherYear)
int otherDays = getDaysCount(otherYear, date.get(Calendar.MONTH) + 1);
return date.get(Calendar.DAY_OF_MONTH) > otherDays;


/**
* 将date用sign分开
* @param date
* @param sign
* @return
*/
public static String formatDate(GregorianCalendar date, String sign)
String y = date.get(Calendar.YEAR) + "";
String m = CalendarKit.getMonthForString(date.get(Calendar.MONTH) + 1);
String d = CalendarKit.getDayForString(date.get(Calendar.DAY_OF_MONTH));
return y + sign + m + sign + d;

参考技术A 直接用compareToIgnoreCase()比较大小

如果要验证日期格式的
可以转化日期,设置一下抛出异常,正确的不会抛出异常,错误的格式在转化是会进行抛出异常

比较日期的大小 ,当然前面说过了转化为日期类型,可以利用Date类的before 和after进行比较
参考技术B 比较对象当然是使用compare方法了,验证格式是否正确,可以使用SimpleDateFormat,然后传入要验证的格式字符串,进行parse,如有异常抛出,那么就是错误的,当然,也可以自己写正则表达式,这个麻烦一些·~正则表达式用百度一搜一大堆,何必造重复的轮子呢?

请教网络高手们,windows驱动中将网络字节序转换为点分十进制数串的函数叫啥名字?

我查了资料应用层是inet_ntoa()函数,不知道驱动层是不是这个函数?

参考技术A 楼主是想问 “网络地址” 转换成 “点分十进制的” 字符串,用如上接口即可inet_ntoa()。

另,网络字节序的话,是指大端小端的概念。 网络字节序都是大端存储,一般的8086机器都是小端。 接口的话,用 htonl ,ntoh l, htons, ntohs。 举例第一个全称为 host to network long 一目了然。
接口使用的话,如果是小端机器,改函数实现大小端转换,如果 本身机器就是大端,该函数里定义为空宏,所以程序里都统一使用,不必担心转换出错。

以上是关于请教高手们java中的字符串/日期的验证问题的主要内容,如果未能解决你的问题,请参考以下文章

请教java高手们,帮我写一个java编写的图片浏览器,功能如下:有自动浏览功能,每隔几秒图片自动翻页。用

刚开始学C++,想请教高手们一下,将CString类型字符串转换为unsigned char型字符数组的转化方式

请教高手怎么删除string数组中的某个元素

高手们,请问一下delphi中日期和时间怎么进行比较大小

Java中字符替换问题,replace方法行不通怎么办,在线等,高手请教哦,急用

请教DELPHI中截图位置的问题,请高手们指点一下.谢谢啦