2017-04-11 48 views
1

我需要一個PowerShell功能來爲當前日期添加23個月,但將當天設置爲第一天。我嘗試了一個while循環來減去日子,但沒有運氣。我有一個月的部分想通了,但我需要到$ current.day設置爲常數1Powershell日期功能問題

function Update-Date { 
    $current = Get-Date 
    $current.AddMonths(11) 
    $current.AddYears(1) 
    $current.Day(1) 

} 

回答

1

有更好,更簡潔的方式來做到這一點(見mklement0的答案),但作爲一個學習的機會,試試這個:

$val = Update-Date 
Write-Host $val 

function Update-Date { 
    $current = Get-Date 
    $current = $current.AddMonths(11) 
    $current = $current.AddYears(1) 
    $current = $current.AddDays(-($current.Day) + 1) 
    return $current 
} 

注意,AddMonths,AddYears,AddDays等不修改原來的日期,而是返回一個新的。您需要每次存儲它,然後執行下一個操作。您可以減去當月的當天,然後加1回到月份的第一天,而不是循環。我添加了一個return語句和代碼將其輸出到屏幕,如果不需要,您可以忽略它。

+0

這是關於'[System.DateTime]'的好信息,但我建議不要使用'Write-Host'(只需使用'$ val'輸出到_success_流 - 而不是直接寫入主機(終端) )和'return'(同樣,只需使用'$ current'輸出值),這樣就不會變成PowerShell反學習機會。 – mklement0

+0

好吧,從技術上來說,做'return $ current'並沒有什麼問題,它只是不是真的很強大。 – 4c74356b41

+0

@ 4c74356b41:這不是「powershellish」恰恰是我的觀點:使用'Write-Host'也沒有什麼_technically_ wrong,但是使用它可能是基於對PowerShell中的輸出如何工作的誤解 - 就像使用「return」一樣,儘管它的使用是良性的。正如目前所寫,代碼加強了對PowerShell的常見誤解。 – mklement0

5

Get-Date cmdlet可以通過其-Day-Month-Year調整指定日期(的副本)組件參數(和類似的時間部分),所以嘗試以下方法:

Get-Date -Day 1 (Get-Date).Date.AddMonths(23) 

注使用.Date,其去除從日期時間的日部分。

在你的函數包裹(改名的一致性使用PowerShell的命名約定;注意功能輸出結果日期):

function Get-UpdateDate { Get-Date -Day 1 (Get-Date).Date.AddMonths(23) }