如何用Perl计算日期间隔分钟并解决日期比较、localtime返回异常问题
问题1:$mon、$hour取值比实际小1的原因
localtime返回的月份$mon取值范围是011(0代表1月,11代表12月),所以需要手动加1才能得到符合日常认知的112月数值,和你写的$year += 1900是同样的内置规则。- 正常情况下
localtime返回的$hour是0~23的整点值,不会比实际小1,如果出现该问题请核对服务器本地时区是否和你预期的时区一致,如果你需要UTC时间请改用gmtime函数获取。
问题2:单数字格式对日期比较的影响
会有影响,且你的日期格式本身就不支持直接比较:
- 你当前用的
DD.MM.YYYY HH:MM:SS格式是小单位在前、大单位在后,不管是数值比较还是字符串比较,都无法正确识别日期先后顺序,比如01.12.2023会被判定为小于02.01.2023,但实际前者时间更晚。 - 单数字的时间字段会导致字符串比较时顺序错误,比如
9:00的字符串排序会比10:00靠后,因为'9'的ASCII码比'1'大。
问题3:比较逻辑永远输出"the current date is smaller"的原因
- 你用了数值比较符
<=来比较字符串,Perl会自动将两个日期字符串转为浮点数,转换时只会保留到第二个.之前的内容,比如06.10.2021 09:38:27会被转为6.1,22.9.2021 10:00:00会被转为22.9,完全丢失了年、小时、分钟、秒的信息,比较逻辑从根上就是错误的。 - 加上你没有给月份加1,输出的日期本身就是错误值,进一步导致比较结果不符合预期。
问题4:计算两个日期的分钟差值的方法
推荐使用Perl 5.10及以上版本内置的Time::Piece模块处理日期,不需要额外安装,解析和计算都很方便,修正后的完整示例如下:
use Time::Piece; # 定义日期格式,匹配你的DD.MM.YYYY HH:MM:SS格式 my $date_format = "%d.%m.%Y %H:%M:%S"; # 1. 计算N分钟之前的时间并格式化 my $difftime = $ARG1; my $t = localtime(time() - 60 * $difftime); # 直接用strftime格式化,自动补零、自动处理月份+1、年份+1900 my $act_date = $t->strftime($date_format); # 2. 解析SQL中的日期字符串 my $sql_value = "06.10.2021 09:38:27"; my $date_to_compare = Time::Piece->strptime($sql_value, $date_format); # 3. 正确比较日期先后 if ($t < $date_to_compare) { print "the current date is smaller"; } else { print "the current date is greater"; } # 4. 计算两个日期的差值(分钟) my $diff_minutes = int(($date_to_compare->epoch - $t->epoch) / 60);
内容的提问来源于stack exchange,提问作者Apfelkuchen
相关产品推荐
相关产品推荐

