免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: ste2008
打印 上一主题 下一主题

怎样简单而快速地判定一个字符串是数值,以及一个字符串是日期 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-23 11:21 |只看该作者
我感觉是否是一个日期这个问题,最好还是用比较成熟的模块来处理。
毕竟像楼上说的那样有很多情况需要考虑。

如果楼主实在不能安装的话,我觉得还可以上cpan找Date::Manip的源代码,把里面ParseDate()和他相关的代码贴到自己的代码中。

论坛徽章:
0
12 [报告]
发表于 2007-03-23 11:40 |只看该作者
原帖由 福瑞哈哥 于 2007-3-23 11:11 发表


感觉判断一个字符串是否是一个日期太难了吧?
那么多格式,英文的,中文的,连字符的,连写的,空格的。。。

肯定是YYYYMMDD的格式,但有可能是 20010230就错了

论坛徽章:
0
13 [报告]
发表于 2007-03-23 11:59 |只看该作者

  1. sub check($) {
  2.     my $date = shift;
  3.     our @days = (undef, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  4.     my ($y, $m, $d);
  5.     if ($date =~ m/^(\d{4})0?([1-9]{1,2})(\d{2})$/) {
  6.         ($y, $m, $d) = ($1, $2, $3);
  7.     }
  8.     else {
  9.         return 0;
  10.     }
  11.     if ($m > 12) {
  12.         return 0;
  13.     }
  14.     my $days = $days[$m];
  15.     if ($m == 2 and $y % 400 == 0 || $y % 4 == 0 && $y % 100 != 0) {
  16.         $days++;
  17.     }
  18.     if ($d > $days) {
  19.         return 0;
  20.     }
  21.     return 1;
  22. }
复制代码

[ 本帖最后由 路小佳 于 2007-3-23 12:07 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2007-03-23 13:17 |只看该作者
  1.     if ($date =~ m/^(\d{4})0?([1-9]{1,2})(\d{2})$/) {
  2.         ($y, $m, $d) = ($1, $2, $3);
  3.     }
  4.     else {
  5.         return 0;
  6.     }
复制代码

这段写得不好。
参考一下:
  1. if ( ( ($y, $m, $d) = $date =~ m/^(\d{4})0?([1-9]{1,2})(\d{2})$/ ) < 3 ){
  2.     return 0;
  3. }
复制代码

或者:
  1. if ( ($y, $m, $d) = unpack( 'a4a2a2', $date ) ) < 3) {
  2.     return 0;
  3. }
复制代码

论坛徽章:
0
15 [报告]
发表于 2007-03-23 15:45 |只看该作者
原帖由 flw 于 2007-3-23 10:50 发表

我的想法和你恰恰相反,非标准模块,能少用就少用。


同意!

论坛徽章:
0
16 [报告]
发表于 2007-03-23 17:44 |只看该作者
原帖由 ste2008 于 2007-3-23 11:40 发表

肯定是YYYYMMDD的格式,但有可能是 20010230就错了


If the date's format is ISO 8601 (international standard date and time
notation), simply using regex or substr() to resolve your problem.

i.e:
/\d{8}/  # exactly 8 digits
or
/(\d{4})([0-1]\d)([0-3]\d)/    # $1:YYYY,$2:MM,$3:DD
or
($y, $m, $d) = (substr($date,0,4), substr($date,4,2), substr($date,6,2));

if you want to check YYYYMMDD further whether it's validated date or not,
there is many choise from CPAN module.

P.S.: ISO 8601 Calendar date
YYYY-MM-DD        or        YYYYMMDD
YYYY-MM        but not        YYYYMM

--ulmer

论坛徽章:
0
17 [报告]
发表于 2007-03-23 18:20 |只看该作者
嗯,谢谢指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP