PowerShell 从本周五开始获得 12 个月的周五

Posted

技术标签:

【中文标题】PowerShell 从本周五开始获得 12 个月的周五【英文标题】:PowerShell Get the Friday 12 Months From This Friday 【发布时间】:2021-11-25 19:34:33 【问题描述】:

我目前正在为备份磁带编写 PowerShell 脚本,并尝试计算磁带的归还日期。我们的供应商会在周五取回磁带。保留期为 4 周、12 个月和 3 年。每月的磁带在每月的第一个星期一,所以我目前正在使用每月的磁带,它将在 12 个月后返回。我如何计算从 2021 年 10 月 8 日星期五开始的 12 个月,但要确保返回日期也是星期五?

#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 当前返回 10/08/2022,即我想要的日期之后的星期六。我想我也会遇到与 $Yearly 相同的问题,如果是闰年怎么办?任何帮助将不胜感激。

【问题讨论】:

顺便说一句:您不需要在方法调用中使用.value__ 属性,因为PowerShell 自动 转换枚举值,例如Sunday(来自枚举@987654321 @) 到它们的基础数字(整数)。 另一边:最好用single Get-Date 调用锁定开始日期,其结果存储在变量中,然后可以在以后的计算中使用.除了更高效之外,它还避免了在Get-Date 调用之间不经意间跨越日历日或 DST 转换边界的问题(尽管在很大程度上是假设性的)。 【参考方案1】:

先加一年:

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

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

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

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

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

【讨论】:

啊,这太简单了,但我想要之前的星期五,所以 $date = $date.AddDays(-1) 那么从日期算起不会是 12 个月,但可以肯定的是,您可以做任何您需要的事情 :-)【参考方案2】:

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

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

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

从周日到周四,您将找到下一个周五。 星期五,你会发现那一天。 对于星期六,您会找到上一个星期五,即前一天

通常,正如 Mathias 在他的回答中指出的那样,您应该在执行日期计算并应用 格式(转换为 string 表示)仅用于计算结果

注意:[datetimeoffset] 会更好,因为它明确表示绝对时间点;[1] 虽然您可以直接使用这种 .NET 类型,但遗憾的是 PowerShell 本身不提供对它的一流支持(尚未),例如通过Get-Date;从 PowerShell 7.2 开始,有几个功能请求处于待处理状态 - 请参阅 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 转换,则可能会跨越日历天边界。

【讨论】:

我采用了这种方法。谢谢你的解释! 很高兴听到它有帮助,@TechFA;我的荣幸。

以上是关于PowerShell 从本周五开始获得 12 个月的周五的主要内容,如果未能解决你的问题,请参考以下文章

如何获得每月的销售额?

java 获得本周一到周五的日期

Powershell 将上个月修改的所有文件报告到 csv

我们如何从当前日期取回 12 个月的日期 [重复]

如何从现在开始使用Java减去30天,3个月和1年的时间?

js如何获取时间