Perl中处理“跨多天”时间的一点小技巧

九月 14th, 2009 | 243 次阅读
Tags: perl 脚本 技术 Posted in 技术杂项 :-)说点什么吧

      这段时间在用perl写一个处理log的脚本,需要在文本中截取出以特定格式描述的时间点,之后根据时间点判断是否在某个duration内。

      由于时间的记数周期不一,例如月份的周期,所以,如果要按照年月日时分秒这样来算,是颇痛苦的,我们可以直接将其做一个转化,转成纪元秒,也就是UNIX世界中的一个统一个时间单位,之后再以秒为单位进行计算,最后再转回人类所使用的格式。

      在这里,我们先读取到以文本描述的时间,提取各个时间单位,从秒到年,存入变量中,之后转化为纪元秒(epoch second):

1 $begin_epoch = timelocal(0,
2                          $begin_mm,
3                          $begin_hh,
4                          $begin_day,
5                          $begin_month-1,
6                          $begin_year);

 

      在这里,将秒、分、时、天、月、年几个参数传入timelocal这个函数,该函数会返回相应的纪元秒。值得注意的是,参数中的月份是从0~11,这是和C函数库一致的,而$begin_month这个变量依然是用1~12月来表示,所以这里要减去1。timelocal这个函数在Time::Local这个模块里面。

      还有一个地方需要注意:

      1. 如果年份参数大于999,该参数就直接表示年份;

      2. 如果参数的大小介于100~999之间,就代表是1900年的一个offset,也就是说112指向的是2012年;

      3. 如果参数值介于0~99,就比较奇妙了,其英文描述是:“interpreted as shorthand for years in the rolling ‘current century,’ defined as 50 years on either side of the current year.”,在1999年,这个参数如果是0,代表的就是2000年,这个参数是55,就代表1955年,但是在2019年的时候,55代表2055年。

     接下来可以对这个纪元秒进行处理,例如,加上D天,H个小时,M分钟可以用这样来表达:

     $end_epoch = $begin_epoch+$D*24*3600+$H*3600+$M*60;

 

     这样的话,$end_epoch就代表了D天H个小时M分钟后的纪元秒,可以将其分解为人类常用的表示格式。用的就是localtime这个函数了,这个是perl的标准库的函数,不需要额外引入模块。用法也很简单:

     @end_time = localtime($begin_epoch);

 

     那么在end_time这个列表里面,就按顺序就包含了秒,分,时,日,月,年,星期几,年中的第几天,通过下面的代码可以形象的描述:

     ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

 

     要注意的就是,这里的月份范围依然是0~11。

Relate Posts:// 相关文章

心血来潮之煮凉粉»
«筵席已散——IBM实习第一阶段结束

“Perl中处理“跨多天”时间的一点小技巧” 共有1条留言

我要留言

10+8=