[英]Date Time day of the week comparison logic in PowerShell
日期时间对象使我们可以执行以下操作:
$CurrentDate = Get-Date
$TextDate = get-date -date "02/10/2016"
if ($TextDate -lt $CurrentDate){
Write-Host "True"
}
else {
Write-Host "False"
}
因为$ TextDate小于$ CurrentDate,所以输出“ True”。
按照相同的逻辑,为什么以下代码输出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。
因为您正在比较string
对象。
(Get-Date -UFormat %V).GetType().FullName
System.String
当使用-gt
和-lt
比较字符串时,它将对字符串进行排序,并且因为6在1后面,因此您的6 -lt 11
-test返回false。
格式化的日期是字符串,而不是整数。 字符串"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星期,它会稍微复杂一些 。
$ TextDate和$ CurrentDate均为[string]类型,因此您要评估的是'6'-lt'11',这将返回false。 运算符基于PowerShell中的左侧类型。 因此,为了强制进行整数比较,请将您的表达式修改为
if ([int]$TextDate -lt $CurrentDate)
{
Write-Host "True"
}
else
{
Write-Host "False"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.