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 个月的周五的主要内容,如果未能解决你的问题,请参考以下文章