Perl脚本DateTime对象比较报错:仅能与另一个DateTime对象比较
问题原因与解决方法
错误根源
你代码里的$datetoday是通过$dt->strftime('%Y%m%d')生成的字符串,而非DateTime对象。strftime的作用是把DateTime实例转换成指定格式的文本,所以拿它和$lastwatermark(DateTime对象)用<比较时,就会触发「A DateTime object can only be compared to another DateTime object」的错误。
解决方法
方法一:直接比较DateTime对象(推荐)
保留$dt的DateTime对象类型,直接和$lastwatermark比较,这样既避免类型冲突,又能准确处理时区等时间逻辑:
use strict; use warnings; use DateTime; use DateTime::Format::Strptime; my $dt = DateTime->now(time_zone=> 'America/New_York'); # 直接使用原始DateTime对象,无需转字符串 my $datetoday = $dt; my $parseseq = DateTime::Format::Strptime->new(pattern => '%Y%m%d'); my $lastwatermark = 20250201; $lastwatermark = $parseseq->parse_datetime($lastwatermark)->set_formatter($parseseq); $lastwatermark->add(days => 2); # 两个DateTime对象直接比较 print "\nlastwatermark is less than datetoday\n" if ($lastwatermark < $datetoday); exit;
方法二:转为同格式字符串后比较
如果确实需要基于字符串格式对比,把$lastwatermark也转成%Y%m%d格式的字符串,再进行字符串比较:
use strict; use warnings; use DateTime; use DateTime::Format::Strptime; my $dt = DateTime->now(time_zone=> 'America/New_York'); my $datetoday = $dt->strftime('%Y%m%d'); my $parseseq = DateTime::Format::Strptime->new(pattern => '%Y%m%d'); my $lastwatermark = 20250201; $lastwatermark = $parseseq->parse_datetime($lastwatermark); $lastwatermark->add(days => 2); # 将DateTime对象转为同格式字符串 my $lastwatermark_str = $lastwatermark->strftime('%Y%m%d'); # 比较两个字符串 print "\nlastwatermark is less than datetoday\n" if ($lastwatermark_str < $datetoday); exit;
内容的提问来源于stack exchange,提问作者James Finnegan
相关产品推荐
相关产品推荐

