PowerShell 从本周五获取 12 个月后的周五

PowerShell Get the Friday 12 Months From This Friday

我目前正在为备份磁带编写 PowerShell 脚本并尝试计算磁带的 return 日期。我们的供应商在星期五收集并 return 编辑磁带。保留期为 4 周、12 个月和 3 年。每月磁带集在每月的第一个星期一发布,因此我目前正在使用每月磁带集,从现在起 return 12 个月后。我如何计算从 2021 年 8 月 10 日星期五开始的 12 个月,但要确保 return 日期也是星期五?

#Calculate Friday - Vaulting Date
$Friday = (Get-Date).AddDays(5-((Get-Date).DayOfWeek.value__)).ToString("MM/dd/yyyy")

#Calculate Return Dates
$Weekly = (Get-Date).AddDays(5-((Get-Date).DayOfWeek.value__)).AddDays(28).ToString("MM/dd/yyyy")
$Monthly = (Get-Date).AddDays(5-((Get-Date).DayOfWeek.value__)).AddMonths(12).ToString("MM/dd/yyyy")
$Yearly = (Get-Date).AddDays(5-((Get-Date).DayOfWeek.value__)).AddYears(3).ToString("MM/dd/yyyy")

$Monthly 当前 returns 10/08/2022 这是我想要的日期之后的星期六。我想我 运行 也会遇到与 $Yearly 相同的问题,如果是闰年怎么办?如有任何帮助,我们将不胜感激。

先加一年:

$date = Get-Date 10/08/2021
$date = $date.AddYears(1)

然后继续一次添加一天,直到到达星期五:

while($date.DayOfWeek -ne 'Friday'){
  $date = $date.AddDays(1)
}

最后,转换为所需的字符串格式(在完成日期计算之前不要转换为字符串,您将无法使用它进行日期时间数学运算:)):

$date.ToString('MM/dd/yyyy')

你走在正确的轨道上,除了:

  • 您的 $someDate.AddDays(5-($someDate.DayOfWeek)) 查找与 $someDate 属于同一周的星期五的方法必须应用 .AddMonths(), ... 调用,即调用未来日期偏移值的 结果

    • 注意:由于您的计算基于 System.DayOfWeek 枚举,其范围从值 0 (Sunday) 到值 6 ( Saturday),其含义是,相对于给定的日期:

      • 从周日到周四,您会找到下一个周五。
      • 对于星期五,您会发现那一天本身。
      • 星期六,您会找到星期五,即
  • 一般来说,正如 Mathias 在他的回答中指出的那样,您应该在执行日期 计算 时使用 [datetime] 个实例并应用 格式化(转换为字符串表示)只对计算结果.

    • 注:[datetimeoffset] would even be better, due to unambiguously denoting absolute points in time;[1] while you can work with this .NET type directly, PowerShell itself unfortunately doesn't offer first-class support for it (yet), such as via Get-Date; several feature requests are pending as of PowerShell 7.2 - see this GitHub search.

总而言之:

# Get today's date without a time-of-day component (via .Date)
# Note: Not strictly necessary, if you use the results only as
#       formatted date-only strings.
$today = (Get-Date).Date

# Find this week's Friday.
$thisFriday = ($today).AddDays(5-($today.DayOfWeek))

# Add an offset.
$futureDate = $thisFriday.AddYears(1)

# Find the future date's adjacent Friday.
$futureFriday = $futureDate.AddDays(5-$futureDate.DayOfWeek)

# Output the result via an aux. object that results in tabular display.
[pscustomobject] @{
  ThisFriday = $thisFriday.ToString('MM/dd/yyyy')
  FutureFriday = $futureFriday.ToString('MM/dd/yyyy')
}

您将看到如下输出:

ThisFriday FutureFriday
---------- ------------
10/08/2021 10/07/2022

[1] [datetimeoffset] 在执行计算时也是 DST-感知(知道夏令时),而 [datetime] 似乎不是。这意味着即使将 天添加到 [datetimeoffset] 实例,如果中间有 DST 转换,也可能会跨越日历天边界。