【问题标题】:Calculate number of days between two dates in Perl在 Perl 中计算两个日期之间的天数
【发布时间】:2017-10-05 23:43:09
【问题描述】:

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

我有两个约会:

  1. 设置用户密码的日期
  2. 用户密码到期日期(设置密码后 180 天)

    use DateTime::Format::Strptime;
    
    my $dt_pattern      = DateTime::Format::Strptime->new( pattern => '%F',);
    my $displayName = $entry->get_value("displayName");
    
    my $pwdLastSet = convertWinFileTimestamp($entry->get_value("pwdLastSet"));
    
    # Determine password expiration date
    my $pwdLastSet_dt = $dt_pattern->parse_datetime($pwdLastSet);
    my $pwdExpirationDate = $pwdLastSet_dt->add( days => $maxPwdAge );
    
    # Days until password expires
    # HELP!!!!!!!
    
    sub convertWinFileTimestamp {
            my $timestamp = shift;
            # Strip off nanoseconds, then adjust date from AD epoch (1601) to UNIX epoch (1970)
            return POSIX::strftime( "%Y-%m-%d",
            localtime( ( $timestamp / 10000000 ) - 11644473600 ) );
    }
    

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

下面是每个变量的输出:

    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

【问题讨论】:

  • 谷歌搜索你的问题的标题会得到这个:perlmonks.org/?node_id=17057 作为第一个结果。请解释它为什么不适合你?
  • 添加以下代码行时出现以下错误: my $pwdDaysLeft = int(($pwdExpirationDate - $pwdLastSet) / 86400); “只能从 DateTime 对象中减去 DateTime::Duration 或 DateTime 对象。在 pwdreminder.pl 第 65 行”
  • 什么是convertWinFileTimestamp?大概$maxPwdAge 是180? pwdExpireDate 是指$pwdExpirationDate 吗?最好展示一段我们可以自己运行的独立代码。
  • 为什么要两次声明并赋值给$pwdLastSet_dt
  • convertWinFileTimestamp 是一个将 windows 时间戳转换为 perl 可以读取的东西的子例程。抱歉pwdLastSet_dt被复制到论坛两次,我会修复它

标签: perl datetime


【解决方案1】:

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

  • 上次设置密码的日期。这以 YYYY-MM-DD 格式的字符串开始,存储在 $pwdLastSet 中,然后您将其解析为存储在 $pwdLastSet_dt 中的 DateTime 对象。
  • 当前密码的过期日期。这是通过将$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');

【讨论】:

  • 就是这样!非常感谢!
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 2015-02-26
  • 2019-09-27
  • 1970-01-01
相关资源
最近更新 更多