时间DateTime的正则表达式(ISO8601)

public const string DateTime =
//-------------日期部分是牛人写的,可以判断闰月
             "^\\s*((((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[469]|11)-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-02-(0[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)[13579][26])-02-29)|(((1[6-9]|[2-9]\\d)[2468][048])-02-29)|(((1[6-9]|[2-9]\\d)0[48])-02-29)|(([13579]6)00-02-29)|(([2468][048])00-02-29)|(([3579]2)00-02-29))" +
//----------------下面是时间部分,属于我的原创.虽然写的不好,但也可以用了.

               "(" +   //-->把时间和上面的日期隔开
                       "((T)|(\\s))(" + //-->时间开始 可以为空格 或者T
                             "([0-1]\\d)|([2][0-4])" + //-->小时
                             "([:][0-5][0-9]){2}" +    //分,秒,重复2次
                       ")\\s*" +
             ")?$";   //-->问号表示时间可以为>=1

支持格式:
2001-12-31 //一般手写的话,基本上写个年月日,所以这个匹配
2001-12-31 24:59:59   //DateTime.ToString()的默认输出格式
2001-12-31T24:59:59//DateTime.ToString("s")输出的ISO8601格式
当然,前后的空格也是允许的.省的用Tirm函数了.
不支持:
2001-1-1   //年和月的0需要不足,不允许缩写
2001-12-31 1:1:1 //这也是缩写,也不允许.


如果做到国际上的程序单子,你会被时间搞崩溃,在欧洲国家,时间和我们这不是一样描述的

所以存入数据库时强烈建议用ISO8601格式(也可以用UTC)

比如我们的格式,通常为 2008年12月31日,但是有的国家就喜欢使用:2008年31日-12月
甚至还有的国家喜欢:31日-12月-2008年.甚至还有用AM PM的.

你拿这种国家没办法,所以可以使用ISO8601格式,适合任何国家.
在输出时格式化一下就可以了.


//-----------------------附加日期牛的的解释(如果不想研究直接用就可以了,很乱)
引用网页:http://www.cnblogs.com/josephshi/archive/2008/04/10/1146582.html

表达式测试范围为1600到9999年

^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|   /*平年闰年1 35 7 8 10 12月*/
    (((1[6-9]|[2-9]\d)\d{2})-(0?[469]|11)-(0?[1-9]|[12]\d|30))|                  /*平年闰年4 6 9 11月*/
    (((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|                /*平年2月*/
    (((1[6-9]|[2-9]\d)[13579][26])-0?2-29)|            /*经过分析只要一个整数的最后两位数能被4整除那么这个数就可以被4整除,于是有了下面五行*/
    (((1[6-9]|[2-9]\d)[2468][048])-0?2-29)|
    (((1[6-9]|[2-9]\d)0[48])-0?2-29)|
    (([13579]6)00-0?2-29)|
    (([2468][048])00-0?2-29)|
    (([3579]2)00-0?2-29))$

月份天数如果是一位数加不加零都可以的版本:
^((((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?[469]|11)-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)[13579][26])-0?2-29)|(((1[6-9]|[2-9]\d)[2468][048])-0?2-29)|(((1[6-9]|[2-9]\d)0[48])-0?2-29)|(([13579]6)00-0?2-29)|(([2468][048])00-0?2-29)|(([3579]2)00-0?2-29))$

月份天数如果是一位数必须加零的版本:
^((((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[469]|11)-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-02-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)[13579][26])-02-29)|(((1[6-9]|[2-9]\d)[2468][048])-02-29)|(((1[6-9]|[2-9]\d)0[48])-02-29)|(([13579]6)00-02-29)|(([2468][048])00-02-29)|(([3579]2)00-02-29))$

你可能感兴趣的:(DateTime)