日期PowerShell中的星期一天比较逻辑

时间:2016-03-10 18:38:54

标签: powershell datetime

Date Time对象允许我们执行以下操作:

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

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

这输出" True"因为$ TextDate小于$ CurrentDate。

遵循相同的逻辑,为什么以下代码输出错误?

$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。

3 个答案:

答案 0 :(得分:2)

因为您正在比较string - 对象。

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

使用-gt-lt比较字符串时,它会对字符串进行排序,因为6位于1之后,您的6 -lt 11 - 测试将返回false。

答案 1 :(得分: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 :(得分:1)

$ TextDate和$ CurrentDate都是[string]类型,所以你评价的是' 6' -lt' 11'这将返回false。运算符基于PowerShell中的左侧类型。因此,为了强制进行整数比较,请在

下修改表达式
if ([int]$TextDate -lt $CurrentDate)
{ 
   Write-Host "True" 
} 
else 
{
   Write-Host "False" 
}