查找每月第一个和第二个星期二之间的星期日

时间:2021-01-10 00:29:37

标签: powershell

刚接触 PS,我想在每个月的第一个和第二个星期二之间的星期日批处理文件。 我知道如何找到我要查找的第 1 个和第 2 个星期二,其他的我不知道。

$FindNthDay = 1
$WeekDay = 'Tuesday'
[datetime]$Today = [datetime]::NOW
$todayM = $Today.Month.ToString()
$todayY = $Today.Year.ToString()
[datetime]$StrtMonth1 = $todayM + '/1/' + $todayY
while ($StrtMonth1.DayofWeek -ine $WeekDay ) { $StrtMonth1 = $StrtMonth1.AddDays(1) }
$StrtMonth1.AddDays(7 * ($FindNthDay - 1))
#
$FindNthDay = 2
$WeekDay = 'Tuesday'
[datetime]$Today = [datetime]::NOW
$todayM = $Today.Month.ToString()
$todayY = $Today.Year.ToString()
[datetime]$StrtMonth = $todayM + '/1/' + $todayY
while ($StrtMonth.DayofWeek -ine $WeekDay ) { $StrtMonth = $StrtMonth.AddDays(1) }
$StrtMonth.AddDays(7 * ($FindNthDay - 1))

3 个答案:

答案 0 :(得分:0)

<块引用>

我知道如何找到第一个和第二个星期二

因为中间只有一个星期天,所以你只需要找到第一个:

# Get-Date -Day 1 will give us the 1st of the current month
$firstTuesday = Get-Date -Day 1
while($firstTuesday.DayOfWeek -ne 'Tuesday') {
  $firstTuesday = $firstTuesday.AddDays(1)
}

然后再增加 5 天:

$sundayAfterFirstTuesday = $firstTuesday.AddDays(5).Date

其中(2021 年 1 月)给了我们:

PS ~> $sundayAfterFirstTuesday
Sunday, January 10, 2021 12:00:00 AM

答案 1 :(得分:0)

除了 Mathias's fine answer 之外,我还挂断了这个。鉴于 .DayOfWeek 是一个很容易转换为 [enum][Int],我一直在寻找一种数学上简洁的方法来推导出第一个星期二。因为很明显如何通过执行 .AddDays(5) 来找到下一个星期日。

老实说,我有点磕磕绊绊,因为虽然 .DayOfWeek 是 0 - 6,但要添加多少天取决于当前日期,在这种情况下是一个月的第一天,是小于还是大于星期二( 2)。值得一玩;这是我想出的两种替代方法:

示例 1:一个根本不简洁但非常易读的 switch 语句:

    $Day1 = Get-Date "1/1/2021"
    Switch ( $Day1.DayOfWeek )
    {
        'Sunday'    { $Sunday = $Day1.Adddays(2).AddDays( 5 ); Break }
        'Monday'    { $Sunday = $Day1.Adddays(1).AddDays( 5 ); Break }
        'Tuesday'   { $Sunday = $Day1.AddDays( 5 );            Break }
        'Wednesday' { $Sunday = $Day1.Adddays(6).AddDays( 5 ); Break }
        'Thursday'  { $Sunday = $Day1.Adddays(5).AddDays( 5 ); Break }
        'Friday'    { $Sunday = $Day1.Adddays(4).AddDays( 5 ); Break }
        'Saturday'  { $Sunday = $Day1.Adddays(3).AddDays( 5 ); Break }
    }
    $Sunday

这也很容易调整。例如,如果您想在第一个和第二个星期一等之间切换到第一个星期日...

对于数学/逻辑方法,结果有点粗糙:

    $Day1 = Get-Date "1/1/2021"
    
    If( [Int]$Day1.DayOfWeek -gt 2 ) { $Interval = 7 - ([Int]$Day1.DayOfWeek - 2) }
    Else { $Interval = 2 - [Int]$Day1.DayOfWeek }
    
    $Sunday = $Day1.AddDays( $Interval ).AddDays( 5 )
    $Sunday

上面的例子可以在 PowerShell 7+ 中使用三元运算符更简洁:

    $Day1     = Get-Date "1/1/2021"
    $Interval = $Day1.DayOfWeek -gt 2 ? 7 - ([Int]$Day1.DayOfWeek - 2) : 2 - [Int]$Day1.DayOfWeek
    $Sunday   = $Day1.AddDays( $Interval ).AddDays( 5 )
    $Sunday

注意:所有示例都以 2021 年 1 月 1 日作为开始日期,但我在一个月的多个第一天进行了测试,例如,如果第一天是星期一、星期日、星期四等...

注意:如果小心 PowerShell 类型转换系统,一些 [Int] 转换可能会被删除,但我想把它放在那里。如果我有时间,我会进一步清理。

答案 2 :(得分:0)

或者稍微不同的方法:

$BaseDate = (Get-Date 3/1/2021)
$BaseDate.AddDays( (& {if ([int]$BaseDate.DayOfWeek -gt 2) {14}
                       else { 7 } }) - [int]($BaseDate).DayOfWeek)

2021 年 3 月 7 日,星期日,上午 12:00:00