2017-10-05 233 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

這是它!非常感謝! –