关于日期的

syj247 2010-04-12 09:03:33
求一个关于日期的正则。。
要能够判断2月的天数。。。
怎么搞 请高手指点
...全文
92 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoeg 2010-04-13
  • 打赏
  • 举报
回复
首先,非常佩服2楼的耐心,我反正是看到吐血;
可惜,找到一个例外:1600-02-29是正确的日期格式,却无法匹配!!!
myeclipse0123 2010-04-13
  • 打赏
  • 举报
回复
不是java不适用,是操作系统只能到那一年应该是1700年
zoeg 2010-04-13
  • 打赏
  • 举报
回复
^((?!0000)[0-9]{4}(-(0?[1-9]|1[0-2])-([01]?[1-9]|10|2[0-8])|-(0?[13-9]|1[0-2])-(29|30)|-(0?[13578]|1[02])-31)|(?!0000)([0-9]{2}(04|08|[2468][048]|[13579][26])|(0[0-9]|1[0-5]|[2468][048]|[13579][26])00)-0?2-29)$
这个对于一般的日期校验已经相当精确了;
不过经过一番研究,居然发现了新大陆:
1、1582-10-05到1582-10-14之间的日期不合法,因为根本没有这10天;
2、闰年还要考虑3200年的周期;
3、闰年同时还要考虑172800年的周期(不过要是因为没有做这个校验产生问题,那我也认了)。
真麻烦,继续努力中,回头给你们贴更精确完善的!!!
zoeg 2010-04-13
  • 打赏
  • 举报
回复
刚才的弄错了,果然是不做不知道,一做吓一跳:
闰年规则中,似乎百年不闰对公元1501年以前不适用,不知道是java API出错了,还是就是这样的!!!
重写了下,修正点小BUG,另外再来个兼容的,可以在js上跑:
^((?!0000)[0-9]{4}(-(0?[1-9]|1[0-2])-([01]?[1-9]|10|2[0-8])|-(0?[13-9]|1[0-2])-(29|30)|-(0?[13578]|1[02])-31)|(?!0000)([0-9]{2}(04|08|[2468][048]|[13579][26])|(0[0-9]|1[0-5]|[2468][048]|[13579][26])00)-0?2-29)$
zoeg 2010-04-13
  • 打赏
  • 举报
回复
我来一个强大的,用几万个边沿数据测试过了:
^(?!0000)[0-9]{4}-((0?[1-9]|1[0-2])-([01]?[1-9]|10|2[0-8]|(?<=-0?[13578]-|-1[02]-)31|(?<!-0?2-)(29|30))|(?<=(?<=[02468][048]|[13579][26]|(?<![02468][048]|[13579][26])00)-)0?2-29)$
注意:(?<=)向左预查需要高版本的正则表达式,非常遗憾地,如果你想用在js上,版本就不够!!!
syj247 2010-04-12
  • 打赏
  • 举报
回复
我的也老没学好。。。 刚那个真的有点长·。 我在Eclipse下分了六行。。。
godismydaughter 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sbfivwsll 的回复:]

^((\d{3}[1-9]|\d{2}[1-9]\d{1}|\d{1}[1-9]\d{2}|[1-9]\d{3})-(((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30))|(02-(0[1-9]|[1]\d|2[0-8]))))|(((\d{2})(0[48]|[2468][048]|[13579][2……
[/Quote]为何我的正则老是学不好。
syj247 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sbfivwsll 的回复:]
^((\d{3}[1-9]|\d{2}[1-9]\d{1}|\d{1}[1-9]\d{2}|[1-9]\d{3})-(((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30))|(02-(0[1-9]|[1]\d|2[0-8]))))|(((\d{2})(0[48]|[2468][048]|[13579][26……
[/Quote]

谢谢
铑枪--突廆孒 2010-04-12
  • 打赏
  • 举报
回复
当然能对2月份的29日进行验证了
铑枪--突廆孒 2010-04-12
  • 打赏
  • 举报
回复
^((\d{3}[1-9]|\d{2}[1-9]\d{1}|\d{1}[1-9]\d{2}|[1-9]\d{3})-(((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30))|(02-(0[1-9]|[1]\d|2[0-8]))))|(((\d{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$
这个正则表达式有点长,是验证的日期格式是 四位年-2位月-2位日的形式

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧