2016-03-10 187 views
0

日期時間對象讓我們像這樣執行操作:在PowerShell中的周比較邏輯的日期時間一天

$CurrentDate = Get-Date 
$TextDate = get-date -date "02/10/2016" 

if ($TextDate -lt $CurrentDate){ 
    Write-Host "True" 
} 
else { 
    Write-Host "False" 
} 

這個輸出「真」,因爲$ TextDate小於$的currentdate。

遵循相同的邏輯,爲什麼下面的代碼輸出爲false?

$CurrentDate = Get-Date -UFormat %V 
$TextDate = Get-Date -date "02/10/2016" 
$TextDate = Get-Date -date $TextDate -UFormat %V 

if ($TextDate -lt $CurrentDate){ 
    Write-Host "True" 
} 
else { 
    Write-Host "False" 
} 

唯一的區別是我們正在比較一年的一週。如果您將比較更改爲-gt,則代碼返回True。

回答

2

格式化日期是字符串,而不是整數。字符串"6"在字符串"11"之後。

這將是這樣做的最正確的方法:

首先,決定什麼是「今年的第一週」,其實就是:

$CalendarWeekRule = [System.Globalization.CalendarWeekRule]::FirstDay; 
#$CalendarWeekRule = [System.Globalization.CalendarWeekRule]::FirstFourDayWeek; 
#$CalendarWeekRule = [System.Globalization.CalendarWeekRule]::FirstFullWeek; 

然後,決定一週中的一天一週的第一天:

$FirstDayOfWeek = [System.DayOfWeek]::Sunday; 
#$FirstDayOfWeek = [System.DayOfWeek]::Monday; 
#Any day is available 

然後你就可以得到您的正確的週數:

$Today = (Get-Date).Date; 
$TodayWeek = [cultureinfo]::InvariantCulture.Calendar.GetWeekOfYear($Today, $CalendarWeekRule, $FirstDayOfWeek); 

$TargetDate = Get-Date -Date "2016-02-10"; 
$TargetWeek = [cultureinfo]::InvariantCulture.Calendar.GetWeekOfYear($TargetDate, $CalendarWeekRule, $FirstDayOfWeek); 

if ($TargetWeek -lt $TodayWeek) { $true } else { $false } 

請注意,如果您想要一個完整的ISO 8601周,它是somewhat more complicated

2

因爲您正在比較string-對象。

(Get-Date -UFormat %V).GetType().FullName 
System.String 

當使用-gt-lt它排序字符串和因爲6自帶1後,您6 -lt 11 - 測試返回false比較字符串。

1

$ TextDate和$ CurrentDate都是[string]類型,所以你正在評估的是'6'-lt'11',它將返回false。運算符基於PowerShell中的左側類型。所以爲了強制一個整數比較修改你的表達,如下

if ([int]$TextDate -lt $CurrentDate) 
{ 
    Write-Host "True" 
} 
else 
{ 
    Write-Host "False" 
}