Perl中处理“跨多天”时间的一点小技巧
这段时间在用perl写一个处理log的脚本,需要在文本中截取出以特定格式描述的时间点,之后根据时间点判断是否在某个duration内。
由于时间的记数周期不一,例如月份的周期,所以,如果要按照年月日时分秒这样来算,是颇痛苦的,我们可以直接将其做一个转化,转成纪元秒,也就是UNIX世界中的一个统一个时间单位,之后再以秒为单位进行计算,最后再转回人类所使用的格式。
在这里,我们先读取到以文本描述的时间,提取各个时间单位,从秒到年,存入变量中,之后转化为纪元秒(epoch second):
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就代表了D天H个小时M分钟后的纪元秒,可以将其分解为人类常用的表示格式。用的就是localtime这个函数了,这个是perl的标准库的函数,不需要额外引入模块。用法也很简单:
那么在end_time这个列表里面,就按顺序就包含了秒,分,时,日,月,年,星期几,年中的第几天,通过下面的代码可以形象的描述:
要注意的就是,这里的月份范围依然是0~11。
>:-))) discount drug phentermine cpde contraindications for wellbutrin 849381 anchors aweigh ringtone 4634 internet personal loans =-[ equity home loan massachusetts rate >:-PPP