代码之家  ›  专栏  ›  技术社区  ›  James Finnegan

DateTime对象只能与另一个DateTime对象进行比较

  •  0
  • James Finnegan  · 技术社区  · 2 月前

    我有一个脚本可以比较2个datetime对象,但错误告诉我:

    DateTime对象只能与另一个DateTime对象进行比较

    我不知道为什么我会得到这个错误,因为这两个变量都是日期时间对象。这是代码。

    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)->set_formatter($parseseq);
    $lastwatermark->add(days => 2);
    
    print "\nlastwatermark is less than datetoday\n" if ($lastwatermark < $datetoday);
    
    exit;
    
    2 回复  |  直到 2 月前
        1
  •  1
  •   ikegami Gilles Quénot    2 月前

    我不知道为什么我会得到这个错误,因为这两个变量都是日期时间对象

    不是这样的。虽然 $lastwatermark 是DateTime对象, $datetoday 是一个字符串。

    解决方案:简单使用 $dt (对象)而不是 $datetoday (字符串)。


    清洁剂:

    my $local_today_dt =
       DateTime->now( time_zone => "local" )
       ->set_time_zone( "floating" )  # See https://stackoverflow.com/q/18489927/589924
       ->truncate( to => "day" );
    
    my $cutoff_dt =
       $local_today_dt->clone
       ->subtract( days => 2 );
    
    my $last_watermark_dt = $parser->parse_datetime( $last_watermark_str );
    
    if ( $last_watermark_dt < $cutoff_dt ) {
       ...
    }
    
        2
  •  0
  •   ikegami Gilles Quénot    2 月前

    Perl 5.36上的完整错误添加了有趣的对象实例细节:

    A DateTime object can only be compared to another DateTime object ( 日期时间=哈希(0x55b56bc53eb0) , 20250221). at l.pl line 16

    我可以通过这个小编辑成功运行你的脚本:

    [...]
    
    # need this to transform object to date string
    $lastwatermark = $lastwatermark->strftime('%Y%m%d');
    
    print "\nlastwatermark is less than datetoday\n" if ($lastwatermark lt $datetoday);