【问题标题】:Date Time day of the week comparison logic in PowerShellPowerShell 中的日期时间星期几比较逻辑
【发布时间】:2016-06-25 18:39:25
【问题描述】:

日期时间对象允许我们执行如下操作:

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

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

这会输出“True”,因为 $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。

【问题讨论】:

    标签: powershell datetime


    【解决方案1】:

    格式化的日期是字符串,而不是整数。字符串"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-objects。

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

      当使用 -gt-lt 比较字符串时,它会对字符串进行排序,因为 6 在 1 之后,所以您的 6 -lt 11-test 返回 false。

      【讨论】:

        【解决方案3】:

        $TextDate 和 $CurrentDate 都属于 [string] 类型,因此您正在评估的是 '6' -lt '11' 这将返回 false。运算符基于 PowerShell 中的左侧类型。因此,为了强制进行整数比较,请修改您的表达式,如下所示

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-26
          • 2017-09-29
          • 1970-01-01
          • 2012-01-20
          • 2017-09-06
          相关资源
          最近更新 更多