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

请教高手们java中的字符串日期的验证问题,第1张

这是我写的一个工具类,其中里面的isLagelDateOfString方法可以检查字符串是否是合法的日期
import javautilCalendar;
import javautilGregorianCalendar;
import javautilregexMatcher;
import javautilregexPattern;
/
提供一些对处理日期实用的静态方法
@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 = dateget(CalendarYEAR);
int m = dateget(CalendarMONTH) + 1;
int d = dateget(CalendarDAY_OF_MONTH);
return isLagelDay(y, m, d);
}

/
返回date的一号是星期几
@param date
@return
/
public static int getWeekForFirst(GregorianCalendar date) {
int day = dateget(CalendarDAY_OF_MONTH);//当前天
int week = dateget(CalendarDAY_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 = Patterncompile("^\\d{4}-\\d{1,2}-\\d{1,2}$");
Matcher match = pmatcher(date);
if(!matchmatches()){ return d; }
String[] str = datesplit("-");
d[0] = IntegerparseInt(str[0]);
d[1] = IntegerparseInt(str[1]);
d[2] = IntegerparseInt(str[2]);
return d;
}

/
如果该日期字符串是有效的返回true
@param date
@return
/
public static boolean isLagelDateOfString(String date) {
Pattern p = Patterncompile("^\\d{4}-\\d{1,2}-\\d{1,2}$");
Matcher match = pmatcher(date);
return matchmatches();
}

/
根据年份和月份获取该月的总天数
如果年份或月份不合法,则返回-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 = dateget(CalendarYEAR);
int month = dateget(CalendarMONTH) + 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(dateget(CalendarYEAR), otherMonth);
return dateget(CalendarDAY_OF_MONTH) > otherDays;
}

/
如果date的当前天数大于otherYear的总天数则返回true
@param date
@param otherYear 和date同一个月份的其他年份
@return
/
public static boolean daysOfCountByYear(GregorianCalendar date, int otherYear) {
int otherDays = getDaysCount(otherYear, dateget(CalendarMONTH) + 1);
return dateget(CalendarDAY_OF_MONTH) > otherDays;
}
/
将date用sign分开
@param date
@param sign
@return
/
public static String formatDate(GregorianCalendar date, String sign) {
String y = dateget(CalendarYEAR) + "";
String m = CalendarKitgetMonthForString(dateget(CalendarMONTH) + 1);
String d = CalendarKitgetDayForString(dateget(CalendarDAY_OF_MONTH));
return y + sign + m + sign + d;
}
}

例如:当时时间可以用Calendar类来获取到。可以直接这样来写:
from object o where ocreateDate>=
直接把获取到的系统时间赋给查询器。

package packjavacalendardemo; \x0d\ \x0d\import javatextSimpleDateFormat; \x0d\import javautilCalendar; \x0d\import javautilDate; \x0d\import javautilGregorianCalendar; \x0d\ \x0d\public class CalendarDemo { \x0d\ private static SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); \x0d\ public static void main(String[] args) { \x0d\ \x0d\ //获取calendar实例; \x0d\ Calendar calendar = CalendargetInstance(); \x0d\ \x0d\ //判断calendar是不是GregorianCalendar类的实例; \x0d\ if(calendar instanceof GregorianCalendar){ \x0d\ Systemoutprintln("属于GregorianCalendar类的实例!"); \x0d\ } \x0d\ \x0d\ //从calendar对象中获得date对象,当前时间; \x0d\ Date dates = calendargetTime(); \x0d\ \x0d\ //格式化时间; \x0d\ String date_str= date_formatformat(dates); \x0d\ Systemoutprintln(date_str); \x0d\ \x0d\ //设置月份05;代表日历的月份6月,因为月份从0开始。 \x0d\ calendarset(CalendarMONTH, 05); \x0d\ \x0d\ int months = calendarget(CalendarMONTH); \x0d\ Systemoutprintln(months); //输出05; \x0d\ \x0d\ //设置日期为2011-07-24 09:59:50 \x0d\ calendarset(2011, 06, 24, 9, 59, 50); \x0d\ String getDate = date_formatformat(calendargetTime()); \x0d\ Systemoutprintln(getDate); //输出2011-07-24 09:59:50; \x0d\ \x0d\ //比较日前大小; \x0d\ if(new Date()getTime() > calendargetTimeInMillis()){ \x0d\ Systemoutprintln("当前日期在后!"); \x0d\ }else{ \x0d\ Systemoutprintln("当前日期在前!"); \x0d\ } \x0d\ \x0d\ //设置当前时间为:2011-07-24 11:06:00 \x0d\ calendarsetTime(new Date()); \x0d\ int year = calendarget(CalendarYEAR); //获取年; \x0d\ int month = calendarget(CalendarMONTH); //获取月; \x0d\ int date = calendarget(CalendarDATE); //获取天; \x0d\ int hour = calendarget(CalendarHOUR); //获取小时; \x0d\ int minute = calendarget(CalendarMINUTE); //获取分钟; \x0d\ int second = calendarget(CalendarSECOND); //获取秒钟; \x0d\ int hour_of_day = calendarget(CalendarHOUR_OF_DAY); //第几个小时, \x0d\ int day_of_month = calendarget(CalendarDAY_OF_MONTH); //这天,在一个月内是第几天 \x0d\ int day_of_week = calendarget(CalendarDAY_OF_WEEK); //这天,在一周内,是第几天 \x0d\ int day_of_year = calendarget(CalendarDAY_OF_YEAR); //这天,在一年内,是第几天。 \x0d\ int week_of_year = calendarget(CalendarWEEK_OF_YEAR); //这周,在一年内是第几周; \x0d\ int week_of_month = calendarget(CalendarWEEK_OF_MONTH);//这周,在这个月是第几周;以以星为标准; \x0d\ int zone_offset = calendarget(CalendarZONE_OFFSET); //获取时区; \x0d\ int day_of_week_in_month = calendarget(CalendarDAY_OF_WEEK_IN_MONTH); //某月中第几周,按这个月1号算,1号起就是第1周,8号起就是第2周。以月份天数为标准 \x0d\ int r = calendarget(CalendarAM_PM); \x0d\ if(r==calendarAM){ \x0d\ Systemoutprintln("现在是上午"); \x0d\ } \x0d\ \x0d\ if(r==calendarPM){ \x0d\ Systemoutprintln("现在是下午"); \x0d\ } \x0d\ Systemoutprintln("=================================================="); \x0d\ Systemoutprintln(year); \x0d\ Systemoutprintln(month); \x0d\ Systemoutprintln(date); \x0d\ Systemoutprintln(hour); \x0d\ Systemoutprintln(minute); \x0d\ Systemoutprintln(second); \x0d\ Systemoutprintln(hour_of_day); \x0d\ Systemoutprintln(day_of_month); \x0d\ Systemoutprintln(day_of_week); \x0d\ Systemoutprintln(day_of_year); \x0d\ Systemoutprintln(week_of_year); \x0d\ Systemoutprintln(week_of_month); \x0d\ Systemoutprintln(zone_offset); \x0d\ Systemoutprintln(day_of_week_in_month); \x0d\ } \x0d\}

大体就这样
String s = "2011-08-09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
GregorianCalendar gc = new GregorianCalendar();
try {
gcsetTime(sdfparse(s));
} catch (ParseException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
gcadd(CalendarDAY_OF_YEAR, -1);

String startDate = sdfformat(gcgetTime()) + " 00:00:00";
String endDate = sdfformat(gcgetTime()) + " 23:59:59";

Timestamp sd = TimestampvalueOf(startDate);
Timestamp ed = TimestampvalueOf(endDate);

Systemoutprintln(sd);
Systemoutprintln(ed);

public static int getDaysBetween (String beginDate, String endDate) throws ParseException
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date bDate = formatparse(beginDate);
Date eDate = formatparse(endDate);
Calendar d1 = new GregorianCalendar();
d1setTime(bDate);
Calendar d2 = new GregorianCalendar();
d2setTime(eDate);
int days = d2get(CalendarDAY_OF_YEAR) - d1get(CalendarDAY_OF_YEAR);
int y2 = d2get(CalendarYEAR);
if (d1get(CalendarYEAR) != y2)
{
d1 = (Calendar) d1clone();
do {
days += d1getActualMaximum(CalendarDAY_OF_YEAR);//得到当年的实际天数
d1add(CalendarYEAR, 1);
} while (d1get(CalendarYEAR) != y2);
}
return days;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13347911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-19
下一篇 2023-07-19

发表评论

登录后才能评论

评论列表(0条)

保存