Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何在powershell中确定一周的第一天?_Date_Powershell - Fatal编程技术网

Date 如何在powershell中确定一周的第一天?

Date 如何在powershell中确定一周的第一天?,date,powershell,Date,Powershell,我有一个运行powershell脚本的计划任务,该脚本运行带有一些参数的可执行文件。其中一个参数是当前周数 我正在powershell中使用以下代码检索周号: get-date -uformat %V 这似乎返回了一个不正确的周数 2014-05-04(星期日),第18周返回(如预期) 2014-05-05(星期一),第18周退货(预计19) 2014-05-06(星期二),第19周退货(如预期) 在我的注册表中,一周的第一天设置为星期一(HKEY_CURRENT_USER->控制面板->

我有一个运行powershell脚本的计划任务,该脚本运行带有一些参数的可执行文件。其中一个参数是当前周数

我正在powershell中使用以下代码检索周号:

get-date -uformat %V
这似乎返回了一个不正确的周数

  • 2014-05-04(星期日),第18周返回(如预期)
  • 2014-05-05(星期一),第18周退货(预计19)
  • 2014-05-06(星期二),第19周退货(如预期)
在我的注册表中,一周的第一天设置为星期一(HKEY_CURRENT_USER->控制面板->国际->iFirstDayOfWeek=0)

有人知道powershell从何处检索它的firstDayOfWeek设置吗?我应该(/可以)在脚本中设置它吗

我知道一个解决方法是使用.AddDays(1),但我正在寻找一个更整洁的解决方案

编辑: 好吧,这真的很奇怪,我收到了不同年份的不同的“每周第一天”

2012年-周六:

PS C:\Users\A730978F> get-date -date "2012-01-08" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-08 Sun Week: 2
PS C:\Users\A730978F> get-date -date "2012-01-09" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-09 Mon Week: 2
PS C:\Users\A730978F> get-date -date "2012-01-10" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-10 Tue Week: 2
PS C:\Users\A730978F> get-date -date "2012-01-11" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-11 Wed Week: 2
PS C:\Users\A730978F> get-date -date "2012-01-12" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-12 Thu Week: 2
PS C:\Users\A730978F> get-date -date "2012-01-13" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-13 Fri Week: 2
PS C:\Users\A730978F> get-date -date "2012-01-14" -uFormat "%Y-%m-%d %a Week: %V"
2012-01-14 Sat Week: 3
2013年-周一:

PS C:\Users\A730978F> get-date -date "2013-01-06" -uFormat "%Y-%m-%d %a Week: %V"
2013-01-06 Sun Week: 1
PS C:\Users\A730978F> get-date -date "2013-01-07" -uFormat "%Y-%m-%d %a Week: %V"
2013-01-07 Mon Week: 2
PS C:\Users\A730978F> get-date -date "2013-01-08" -uFormat "%Y-%m-%d %a Week: %V"
2013-01-08 Tue Week: 2
2014年-周二:

PS C:\Users\A730978F> get-date -date "2014-01-05" -uFormat "%Y-%m-%d %a Week: %V"
2014-01-05 Sun Week: 1
PS C:\Users\A730978F> get-date -date "2014-01-06" -uFormat "%Y-%m-%d %a Week: %V"
2014-01-06 Mon Week: 1
PS C:\Users\A730978F> get-date -date "2014-01-07" -uFormat "%Y-%m-%d %a Week: %V"
2014-01-07 Tue Week: 2
2015年-周三:

PS C:\Users\A730978F> get-date -date "2015-01-04" -uFormat "%Y-%m-%d %a Week: %V"
2015-01-04 Sun Week: 1
PS C:\Users\A730978F> get-date -date "2015-01-05" -uFormat "%Y-%m-%d %a Week: %V"
2015-01-05 Mon Week: 1
PS C:\Users\A730978F> get-date -date "2015-01-06" -uFormat "%Y-%m-%d %a Week: %V"
2015-01-06 Tue Week: 1
PS C:\Users\A730978F> get-date -date "2015-01-07" -uFormat "%Y-%m-%d %a Week: %V"
2015-01-07 Wed Week: 2
(请注意,我并不是每年都尝试所有的周)

编辑2:

再次查看示例后,周数似乎是基于过去的“7天”的数量。我猜它实际上根本没有使用任何“一周的第一天”设置。我想我得做一些相应的计算


无论如何,谢谢你的帮助

这个问题是由不同的全球化规则造成的。美国的周数计算方式与德国不同


为了获得预期的周编号,您必须使用全球化设置来拉一些字符串。另一个a详细讨论了该主题。

显然powershell参数
-uformat%V
实际上没有使用任何类型的“每周第一天”规则。它实际上只是显示了自年初(从1开始)以来已经过去的“7天”

使用此信息,我创建了以下函数,用于检索一周中每一天(星期日至星期六)的相同正确周数:

(感谢@DavidBrabant和@vonPryz提供我所需的额外信息)

(我使用了一个参数,因此函数更灵活/可测试)

此函数基本上根据一年中的第n个星期三获取周数,并将星期日用作一周的第一天(我没有花时间更改它,因为这实际上是我公司使用的惯例)

您可以说,它根据今年至少有4天的第一周检索周数,一周的第一天是星期天。

在PowerShell 7.x.y中:

[System.Globalization.ISOWeek]::GetWeekOfYear((get-date))
在PowerShell 5.x.y中:

function Get-ISOWeek {
  Param(
        [Parameter(
            # Mandatory,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName,
            HelpMessage = 'Valid Date'
        )]
        [Alias('DT', 'DateTime')]
            [datetime[]]$Dates = (Get-Date),
        [Validateset('Culture', 'UICulture', 'InvariantCulture')]
        [string]$Culture
    )
    <#
        First create an integer(0/1) from the boolean,
        "Is the integer DayOfWeek value greater than zero?".
        Then Multiply it with 4 or 6 (weekrule = 0 or 2) minus the integer DayOfWeek value.
        This turns every day (except Sunday) into Thursday.
        Then return the ISO8601 WeekNumber.
    #>
    BEGIN {
        $Cult = Switch ($Culture) {
            'UICulture' {
                Get-UICulture
                Break
            }
            'InvariantCulture' {
                [CultureInfo]::InvariantCulture
                Break
            }
            default{
                Get-Culture
            }
        }
        $WeekRule = $Cult.DateTimeFormat.CalendarWeekRule.value__
        $FirstDayOfWeek = $Cult.DateTimeFormat.FirstDayOfWeek.value__
    }
    PROCESS{
        ForEach ($DateElement in $Dates) {
            Try {
                Write-Verbose "------------------------"
                Write-Verbose "Try to turn $DateElement into ISO8601Week"
                $WeekRuleDay = [int]($DateElement.DayOfWeek.Value__ -ge $FirstDayOfWeek ) * ( (6 - $WeekRule) - $DateElement.DayOfWeek.Value__ )
                $WeekNumber = $Cult.Calendar.GetWeekOfYear(($DateElement).AddDays($WeekRuleDay), $WeekRule, $FirstDayOfWeek)
<#
I need to check the DayNumber formula. The FirstDayOfTheWeek must become 1
In the Netherlands we start with Monday
#>
                $DayNumber = (7, 1, 2, 3, 4, 5, 6)[$($DateElement.DayOfWeek.value__ + 1)]
                $Properties = @{
                    Date = Get-Date($DateElement)
                    LongDate = Get-Date($DateElement).ToLongDateString()
                    WeekRuleDay = $WeekRuleDay
                    WeekNumber = $WeekNumber
          ISOWeek    = "$($DateElement.Year)-W$WeekNumber"
          ISOWeekDay = "$($DateElement.Year)-W$WeekNumber-$DayNumber"
          ISO8601Week    = "$($DateElement.Year)-W$WeekNumber"
                    ISO8601WeekDay = "$($DateElement.Year)-W$WeekNumber-$DayNumber"
                }
            } Catch {
                Write-Verbose "Could not turn: $DateElement into ISO8601Week"
                $Properties = @{
                    Date = $DateElement
                    LongDate = ''
                    WeekRuleDay = ''
                    WeekNumber = ''
          ISOWeek    = ''
          ISOWeekDay = ''
          ISO8601Week    = ''
                    ISO8601WeekDay = ''
                }
            } Finally{
                Write-Verbose "Final"
                $Obj = New-Object -Typename PSCustomObject -Property $Properties
                Write-Output $Obj
            }
            
        }
    }
    END{}
}

相关报道:谢谢你的回答,第53周确实是我遇到的另一个问题。然而,这个问题实际上是关于如何根据一周中的哪一天获取正确的周数的问题(周的变化并不总是在周日和周一之间)
function Get-ISOWeek {
  Param(
        [Parameter(
            # Mandatory,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName,
            HelpMessage = 'Valid Date'
        )]
        [Alias('DT', 'DateTime')]
            [datetime[]]$Dates = (Get-Date),
        [Validateset('Culture', 'UICulture', 'InvariantCulture')]
        [string]$Culture
    )
    <#
        First create an integer(0/1) from the boolean,
        "Is the integer DayOfWeek value greater than zero?".
        Then Multiply it with 4 or 6 (weekrule = 0 or 2) minus the integer DayOfWeek value.
        This turns every day (except Sunday) into Thursday.
        Then return the ISO8601 WeekNumber.
    #>
    BEGIN {
        $Cult = Switch ($Culture) {
            'UICulture' {
                Get-UICulture
                Break
            }
            'InvariantCulture' {
                [CultureInfo]::InvariantCulture
                Break
            }
            default{
                Get-Culture
            }
        }
        $WeekRule = $Cult.DateTimeFormat.CalendarWeekRule.value__
        $FirstDayOfWeek = $Cult.DateTimeFormat.FirstDayOfWeek.value__
    }
    PROCESS{
        ForEach ($DateElement in $Dates) {
            Try {
                Write-Verbose "------------------------"
                Write-Verbose "Try to turn $DateElement into ISO8601Week"
                $WeekRuleDay = [int]($DateElement.DayOfWeek.Value__ -ge $FirstDayOfWeek ) * ( (6 - $WeekRule) - $DateElement.DayOfWeek.Value__ )
                $WeekNumber = $Cult.Calendar.GetWeekOfYear(($DateElement).AddDays($WeekRuleDay), $WeekRule, $FirstDayOfWeek)
<#
I need to check the DayNumber formula. The FirstDayOfTheWeek must become 1
In the Netherlands we start with Monday
#>
                $DayNumber = (7, 1, 2, 3, 4, 5, 6)[$($DateElement.DayOfWeek.value__ + 1)]
                $Properties = @{
                    Date = Get-Date($DateElement)
                    LongDate = Get-Date($DateElement).ToLongDateString()
                    WeekRuleDay = $WeekRuleDay
                    WeekNumber = $WeekNumber
          ISOWeek    = "$($DateElement.Year)-W$WeekNumber"
          ISOWeekDay = "$($DateElement.Year)-W$WeekNumber-$DayNumber"
          ISO8601Week    = "$($DateElement.Year)-W$WeekNumber"
                    ISO8601WeekDay = "$($DateElement.Year)-W$WeekNumber-$DayNumber"
                }
            } Catch {
                Write-Verbose "Could not turn: $DateElement into ISO8601Week"
                $Properties = @{
                    Date = $DateElement
                    LongDate = ''
                    WeekRuleDay = ''
                    WeekNumber = ''
          ISOWeek    = ''
          ISOWeekDay = ''
          ISO8601Week    = ''
                    ISO8601WeekDay = ''
                }
            } Finally{
                Write-Verbose "Final"
                $Obj = New-Object -Typename PSCustomObject -Property $Properties
                Write-Output $Obj
            }
            
        }
    }
    END{}
}
(20..31).ForEach( { (Get-ISOWeek("2012-12-$($_)")).ISOWeekDay }) + ((1..7).ForEach( { (Get-ISOWeek("2013-1-$($_)")).ISOWeekDay })) -join ','