Java日期格式验证几个实例程序

需求:因为系统有很多日期格式,所以日期验证函数的输入是一个日期字符串和一个格式字符串。格式字符串用的是Java定义的格式(参考地址)。
刚开始写时,觉得很简单,直接就写了下面的代码。

 代码如下 复制代码

public static boolean isDate(String dttm, String format) {
    boolean retValue = false;
    if (dttm != null) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        try {
            formatter.parse(dttm);
            retValue = true;
        } catch (ParseException e) {
        }
    }
    return retValue;
}

写好之后,一测试,发现2012/12/43这种日期居然也返回True,于是查资料,设置转化时不进位formatter.setLenient(false);之后好用了,代码为

 代码如下 复制代码

public static boolean isDate(String dttm, String format) {
    boolean retValue = false;
    if (dttm != null) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        formatter.setLenient(false);
        try {
            formatter.parse(dttm);
            retValue = true;
        } catch (ParseException e) {
        }
    }
    return retValue;
}

写到这里,以为万事大吉了。但之后的测试却发现,当日期有分隔符时,只会转换前一部分,比如2012/12/43ABCD也会返回True。想了一下,觉得先转为日期型,再转为字符串,再比较两者是否相等,但马上就否决了这个方案,因为客户要求的是不严格的日期形式,如格式为yyyy/MM/dd,输入2012/1/2也需要验证通过。然后考虑了一下,觉得先用正则表达式做一次验证,然后再验证是否是日期型。代码如下

 代码如下 复制代码

public static boolean isDate(String dttm, String format) {
    boolean retValue = false;

    if (dttm == null || dttm.isEmpty() || format == null || format.isEmpty()) {
        return retValue;
    }

    String regFormat = format;
    regFormat = regFormat.replaceAll("(^')|('$)", "");
    regFormat = regFormat.replaceAll("'([^'])", "$1");
    regFormat = regFormat.replace("''", "'");
    regFormat = regFormat.replace("\", "\\");
    regFormat = regFormat.replaceAll("[MdHmsS]+", "\\d+");
    regFormat = regFormat.replaceAll("[y]+", "\\d{1,4}");
    if (!dttm.matches("^" + regFormat + "$")) {
        return false;
    }

    SimpleDateFormat formatter = new SimpleDateFormat(format);
    formatter.setLenient(false);
    try {
        formatter.parse(dttm);
        retValue = true;
    } catch (ParseException e) {
    }

    return retValue;
}

上面的代码只对应了yMdHmsS,虽然对当时的系统已经足够了,但还是感觉不太爽,觉得应该有一种通用的方法。于是查Java的API,发现parse方法还有一个带参数的方法。理解了它的使用方法之后,把代码改成下面的样子

 代码如下 复制代码

 private static boolean isDate(String dttm, String format) {
    if (dttm == null || dttm.isEmpty() || format == null || format.isEmpty()) {
        return false;
    }

    DateFormat formatter = new SimpleDateFormat(format);
    formatter.setLenient(false);
    ParsePosition pos = new ParsePosition(0);
    Date date = formatter.parse(dttm, pos);

    if (date == null || pos.getErrorIndex() > 0) {
        return false;
    }
   
    if (pos.getIndex() != dttm.length()) {
        return false;
    }

    return true;
}

本来以为这样应该万事大吉了,但之后的测试又发现两个Bug。一个是,当输入的日期没有年份(需求是没有输入年份是默认当前年份)时,默认取的是1970年,这样的话,如果当年是闰年的话,2/29号就验证出错了;另一个是Java的日期和Oracle的日期大小不同,Oracle好像最大只支持到9999年,而Java可以有2万多年。所以代码又被改成了下面的样子

 代码如下 复制代码

private static boolean isDate(String dttm, String format) {
    if (dttm == null || dttm.isEmpty() || format == null || format.isEmpty()) {
        return false;
    }

    if (format.replaceAll("'.+?'", "").indexOf("y") < 0) {
        format += "/yyyy";
        DateFormat formatter = new SimpleDateFormat("/yyyy");
        dttm += formatter.format(new Date());
    }

    DateFormat formatter = new SimpleDateFormat(format);
    formatter.setLenient(false);
    ParsePosition pos = new ParsePosition(0);
    Date date = formatter.parse(dttm, pos);

    if (date == null || pos.getErrorIndex() > 0) {
        return false;
    }
    if (pos.getIndex() != dttm.length()) {
        return false;
    }

    if (formatter.getCalendar().get(Calendar.YEAR) > 9999) {
        return false;
    }

    return true;
}

时间: 2024-10-26 17:13:52

Java日期格式验证几个实例程序的相关文章

JS判断日期格式是否合法的简单实例_javascript技巧

类似于PHP中的Checkdate. //函数名:CheckDateTime //功能介绍:检查是否为日期时间 function CheckDateTime(str){ var reg = /^(\d+)-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; var r = str.match(reg); if(r==null)return false; r[2]=r[2]-1; var d= new Date(r[1], r[2],r[3],

java日期格式如何转换

问题描述 java日期格式如何转换 如何将Java的日期的不同格式转换成统一格式,比如20150526,2015-5-26,2015/5/26. 因为数据库日期太乱了,有的是20150526有的是2015-5-6,现在需要将他们转为统一格式比如20150526.求大神帮助. 解决方案 public static void main(String[] args) { String[] arr = new String[]{"2015年1月1日","2015-1-1",

js和C# 时间日期格式转换的简单实例_javascript技巧

下午在搞MVC和EXTJS的日期格式互相转换遇到了问题,我们从.NET服务器端序列化一个DateTime对象的结果是一个字符串格式,如 '/Date(1335258540000)/' 这样的字串. 整数1335258540000实际上是一个1970 年 1 月 1 日 00:00:00至这个DateTime中间间隔的毫秒数.通过javascript用eval函数可以把这个日期字符串转换为一个带有时区的Date对象,如下 用var date = eval('new ' + eval('/Date(

日期格式验证

问题描述 如何验证型如dd/mm/yyyy格式的日期,就这一种格式,不会有其他的格式. 解决方案 解决方案二:正则表达式这是YYYY-MM-DD格式的^((((1[6-9]|[2-9]d)d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]d|3[01]))|(((1[6-9]|[2-9]d)d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]d|30))|(((1[6-9]|[2-9]d)d{2})-0?2-(0?[1-9]|1d|2[0-8

java日期格式问题,求大神帮助(或许你没发现过的问题)

问题描述 发现问题的原因:之前数据生成NC文件,其中将日期转成long型,用于以后取时好比较和求差在做数据校验时,发现有部分日期和数据库里对不上,仔细检验后发现时将日期转成long再转回来时日期不对了...测试代码如下:leDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Calendarcalendar=Calendar.getInstance();Stringdate="1986-05-0400:00:00&q

Winform之TextBox输入日期格式验证yyyy-mm-dd_C#教程

复制代码 代码如下: private void button1_Click(object sender, EventArgs e)        {            string s = textBox1.Text.ToString();            bool b = ValidateDataTime(s);            string rs = "";            if (b)            {                rs = &qu

Java 8中简单Lambda表达式实例程序教程

我尝试过把Lambda表达式融入到我的代码中,下面的代码例子是此次尝试的结果.对于那些完全不知道Lambda表达式的Java程序员,我强烈建议在继续阅读之前,浏览一下这篇文章. Ok,现在你已经熟悉Lambda表达式了(在阅读过推荐的Lambda入门文章之后),那我们现在开始学习一个我认为很好的Lambda表达式的例子. 考虑一下这种场景:某些操作在执行之前需要做预处理,执行之后需要做后期处理.待执行的操作会随着行为的不同而变化.预处理会提取出这个操作所需的必要参数,后期处理做一些清理的工作.

js常用的日期格式验证函数

// Function Description: 判断输入是否是有效的时间格式 - "HH:MM:SS" String.prototype.isValidTime=function() { var resule=this.match(/^(d{1,2})(:)?(d{1,2})2(d{1,2})$/); if (result==null) return false; if (result[1]>24 || result[3]>60 || result[4]>60) r

java中nio的socket通信实例程序

虽然Java平台有不少相当不错的一步socket的框架,比如Netty,naga等,但是我们应该知其然并知其所以然. nio是java New IO 的简称,从jdk1.4里提供的新api,Sun官方标榜的特性如下: 为所有的原始类型提供 (Buffer) 缓存支持 字符集编码解码解决方案 Channel:一个新的原始 I/O 抽象 支持锁和内存映射文件的文件访问接口 提供多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O 基本原理 NIO 有一个主要的类Selector,这个类似