2017-10-05 261 views
0

我正在使用Perl创建一个将发送密码到期通知的脚本。计算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)); 
    } 
    
  3. 日期

我想不出如何计算两个日期之间的差异!

下面是每个变量的输出:

pwdLastSet:  2015-02-12 
    pwdExpireDate: 2015-08-11T00:00:00 

任何帮助非常赞赏...一直使用Google像疯了似的,但我想不出它...谢谢!

我尝试下面的代码行:

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 
+0

谷歌搜索问题的标题带来了这样的:http://www.perlmonks.org/?node_id=17057作为第一个结果。请解释它如何不适合你? – Arkadiy

+0

当我添加以下代码行时,出现以下错误:my $ pwdDaysLeft = int(($ pwdExpirationDate - $ pwdLastSet)/ 86400); “只有DateTime :: Duration或DateTime对象可以从DateTime对象中减去。at pwdreminder。pl line 65“ –

+0

什么是”convertWinFileTimestamp“?大概$ maxPwdAge是180?通过'pwdExpireDate',你的意思是'$ pwdExpirationDate'吗?最好是展示一个我们可以运行的自包含的代码片段 – Borodin

回答

2

因此,我们有三个日期的位置:

  • 装日期,密码是上次设置的。它以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'); 
+0

这是它!非常感谢! –

相关问题