Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中计算两个日期之间的天数_Perl_Datetime - Fatal编程技术网

在Perl中计算两个日期之间的天数

在Perl中计算两个日期之间的天数,perl,datetime,Perl,Datetime,我正在使用Perl创建一个脚本,该脚本将通过电子邮件发送密码过期通知 我有两个约会: 设置用户密码的日期 用户密码将过期的日期(设置密码后180天) 我不知道如何计算这两个日期之间的差异 以下是每个变量的输出: pwdLastSet: 2015-02-12 pwdExpireDate: 2015-08-11T00:00:00 非常感谢任何帮助…一直疯狂地在谷歌上搜索,但我想不出来…谢谢 我尝试了以下代码行: my $pwdDaysLeft = int(($p

我正在使用Perl创建一个脚本,该脚本将通过电子邮件发送密码过期通知

我有两个约会:

  • 设置用户密码的日期
  • 用户密码将过期的日期(设置密码后180天)

  • 我不知道如何计算这两个日期之间的差异

    以下是每个变量的输出:

        pwdLastSet:     2015-02-12
        pwdExpireDate:  2015-08-11T00:00:00
    
    非常感谢任何帮助…一直疯狂地在谷歌上搜索,但我想不出来…谢谢

    我尝试了以下代码行:

        my $pwdDaysLeft = int(($pwdExpirationDate - $pwdLastSet) / 86400);
    
    但出现以下错误:

        Only a DateTime::Duration or DateTime object can  be subtracted from a DateTime object. at pwdreminder.pl line 65
    

    所以,我们这里有三个日期:

    • 上次设置密码的日期。它以存储在
      $pwdLastSet
      中的格式为
      YYYY-MM-DD
      的字符串开始,然后将其解析为存储在
      $pwdLastSet\u dt
      中的日期时间对象
    • 当前密码过期的日期。这是通过将
      $maxPwdAge
      天添加到
      $pwdLastSet_dt
      中来计算的,它给出了一个DateTime对象,然后该对象存储在
      $pwdExpirationDate
    • 当前日期。在您当前的代码中,您不需要计算
    你真正想要的是这两个日期中第二个和第三个之间的天数差。我们可以忽略第一个日期,因为它只用于计算第二个日期。我想你的计算是正确的

    希望密码过期日期永远在将来。所以我们要做的计算是:

    my $diff = $pwdExpirationDate - $current_date;
    
    只要这两个对象都是DateTime对象,我们就会得到一个DateTime::Duration对象,然后我们可以询问天数

    DateTime有一个将给出当前日期的
    today()
    方法。因此,我们的代码变成:

    # Use delta_days() to get a duration object that just contains days
    my $diff = $pwdExpirationDate->delta_days(DateTime->today);
    print $diff->in_units('days');
    

    所以,我们这里有三个日期:

    • 上次设置密码的日期。它以存储在
      $pwdLastSet
      中的格式为
      YYYY-MM-DD
      的字符串开始,然后将其解析为存储在
      $pwdLastSet\u dt
      中的日期时间对象
    • 当前密码过期的日期。这是通过将
      $maxPwdAge
      天添加到
      $pwdLastSet_dt
      中来计算的,它给出了一个DateTime对象,然后该对象存储在
      $pwdExpirationDate
    • 当前日期。在您当前的代码中,您不需要计算
    你真正想要的是这两个日期中第二个和第三个之间的天数差。我们可以忽略第一个日期,因为它只用于计算第二个日期。我想你的计算是正确的

    希望密码过期日期永远在将来。所以我们要做的计算是:

    my $diff = $pwdExpirationDate - $current_date;
    
    只要这两个对象都是DateTime对象,我们就会得到一个DateTime::Duration对象,然后我们可以询问天数

    DateTime有一个将给出当前日期的
    today()
    方法。因此,我们的代码变成:

    # Use delta_days() to get a duration object that just contains days
    my $diff = $pwdExpirationDate->delta_days(DateTime->today);
    print $diff->in_units('days');
    

    在谷歌上搜索你问题的标题,结果是:第一个结果。请解释它如何不适用于您?当我添加以下代码行时,会出现以下错误:my$pwdDaysLeft=int(($pwdExpirationDate-$pwdLastSet)/86400);“只能从DateTime对象中减去DateTime::Duration或DateTime对象。在pwdreminder.pl第65行,“什么是
    convertWinFileTimestamp
    ?大概,
    $maxPwdAge
    是180?您所说的
    pwdExpireDate
    ,是指
    $pwdexpiridiondate
    ?最好显示一段我们可以自己运行的自包含代码。为什么要声明并分配给
    $pwdlastsetdt
    两次?convertWinFileTimestamp是一个将windows时间戳转换为perl可以读取的内容的子例程。很抱歉,pwdLastSet_dt两次被复制到论坛中,我会修复它。谷歌搜索你问题的标题会带来这样的结果:作为第一个结果。请解释它如何不适用于您?当我添加以下代码行时,会出现以下错误:my$pwdDaysLeft=int(($pwdExpirationDate-$pwdLastSet)/86400);“只能从DateTime对象中减去DateTime::Duration或DateTime对象。在pwdreminder.pl第65行,“什么是
    convertWinFileTimestamp
    ?大概,
    $maxPwdAge
    是180?您所说的
    pwdExpireDate
    ,是指
    $pwdexpiridiondate
    ?最好显示一段我们可以自己运行的自包含代码。为什么要声明并分配给
    $pwdlastsetdt
    两次?convertWinFileTimestamp是一个将windows时间戳转换为perl可以读取的内容的子例程。抱歉,pwdLastSet_dt被复制到论坛中两次,我会修复它的。原来是这样!非常感谢你!就这样!非常感谢你!