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 转换,也可能会跨越日历天边界。
我目前正在为备份磁带编写 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 viaGet-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 转换,也可能会跨越日历天边界。