【问题标题】:PowerShell returns 2 as week number on January 06 2020PowerShell 返回 2 作为 2020 年 1 月 6 日的周数
【发布时间】:2020-01-06 13:56:21
【问题描述】:

一个简单的问题,显然今天(2020 年 1 月 6 日)周数应该是 2,因为 2020 年有 53 周。

但是,以下 PowerShell sn-p 返回 1:

(Get-Date -UFormat %V)

正确获取周数的好方法是什么?

【问题讨论】:

  • PowerShell 为此遵从 .NET,而 .NET 并没有完全实现 ISO 周数,根据 this question。修复此问题的代码 sn-ps 可以使用 Add-Type 直接导入 PowerShell,否则代码很容易直接转换为 PowerShell。
  • 顺便说一下,一年中的总周数无关紧要。 (ISO) 周数是 2 的原因是因为前一周是 1,而该周是 1 的原因是因为它是包含第一个星期四的周。今年有 53 个 ISO 周,因为从星期三开始是闰年,但这不是同等属性。

标签: powershell week-number getdate


【解决方案1】:

要将这个Get the correct week number of a given date C# 答案从@il_guru 翻译成PowerShell:

Function GetIso8601WeekOfYear([DateTime]$Date) {
    $Day = (Get-Culture).Calendar.GetDayOfWeek($Date)
    if ($Day -ge [DayOfWeek]::Monday -and $Day -le [DayOfWeek]::Wednesday) {$Date = $Date.AddDays(3)}
    (Get-Culture).Calendar.GetWeekOfYear($Date, 'FirstFourDayWeek', 'Monday')
}
GetIso8601WeekOfYear (Get-Date)
2
GetIso8601WeekOfYear (Get-Date('2016-01-01'))
53

【讨论】:

    【解决方案2】:

    您可以检测到闰年,然后根据结果调整周数。

    if(((Get-Date).year)%4 -eq 0){
        $week = (Get-Date -UFormat %V) -as [int]
        $week++
    }else{
        $week = (Get-Date -UFormat %V)
    }
    Write-Host $week
    

    【讨论】:

    • 似乎不仅以4计算模数就足够了,其他条件也应该这样考虑:` $currentYear = (Get-Date -f yyyy) if ( ( ($currentYear % 4 -eq 0) -and ($currentYear % 100 -ne 0) ) -or ($currentYear % 400 -eq 0) ) { Write-Host "Leap" } else { Write-Host "No Leap" }`跨度>
    • 我同意@Abdul Rahman Sherzad 的观点,你不能只看闰年并增加一周,例如为 1 jan 2016 返回 54。
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2019-10-02
    相关资源
    最近更新 更多