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。
答案 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"
}