Perl使用DateTime模块获取带正负号的日期天数差方法
实现方案
DateTime 模块的 delta_days() 方法返回的差值默认是绝对值,要获取带正负符号的天数差,有两种常用实现方式:
方式1:基于原有delta_days逻辑加符号判断
DateTime对象重载了比较运算符,可以直接判断日期先后,给计算得到的绝对值加上对应符号即可:
sub delta_days { my $date1 = shift; my $date2 = shift; my $d1 = str_to_date_object($date1); my $d2 = str_to_date_object($date2); my $abs_days = $d2->delta_days($d1)->delta_days(); # 日期更早的一方作为被减数时结果为负,反之为正 return $d2 < $d1 ? -$abs_days : $abs_days; } # 测试输出 say delta_days('2021-10-21', '1980-8-20'); # -15037 say delta_days('1980-8-20', '2021-10-21'); # 15037
方式2:儒略日直接相减(更简洁)
直接调用jd()方法获取日期对应的儒略日数值,两个值直接相减得到的就是天然带符号的天数差:
sub delta_days { my $date1 = shift; my $date2 = shift; my $d1 = str_to_date_object($date1); my $d2 = str_to_date_object($date2); return $d2->jd - $d1->jd; }
两种方式都可以实现带正负标识的天数差计算,第二种实现更简洁高效。
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

