PowerShell备份磁带归还日期计算:求距当前周五12个月后的周五
PowerShell磁带归还日期计算修复方案
问题根因
原有代码仅在计算初始归档周五时做了星期对齐,追加12个月/3年周期后没有再次做周五校验调整,而公历年/月天数不是7的整数倍,会导致星期偏移,因此出现返回周六的问题。.NET内置的AddMonths()、AddYears()方法已经自动处理闰年逻辑,无需额外开发适配。
修复逻辑
- 先将日期作为DateTime对象计算,避免提前格式化丢失日期属性
- 封装通用的周五对齐方法,所有周期计算完成后统一做周五调整
- 共用同一基准时间变量,避免多次调用
Get-Date()出现跨天时间不一致问题
完整修改后代码
# 通用方法:将输入日期对齐到最近的周五(默认优先当周周五,超过则向前对齐) function ConvertTo-Friday([DateTime]$InputDate) { return $InputDate.AddDays(5 - [int]$InputDate.DayOfWeek) } # 取当前时间作为统一计算基准,避免跨天误差 $now = Get-Date # 计算归档基准周五 $vaultFriday = ConvertTo-Friday $now # 计算各类型归还日期,先加周期再对齐周五,最后格式化 $Weekly = (ConvertTo-Friday $vaultFriday.AddDays(28)).ToString("MM/dd/yyyy") $Monthly = (ConvertTo-Friday $vaultFriday.AddMonths(12)).ToString("MM/dd/yyyy") $Yearly = (ConvertTo-Friday $vaultFriday.AddYears(3)).ToString("MM/dd/yyyy")
效果验证
以你举的2021年10月8日(周五)为例:
- 加12个月得到2022年10月8日(周六)
- 对齐周五计算:
5 - 6 = -1,加-1天得到2022年10月7日(周五),符合需求。
可选调整:如果要求归还日期必须晚于周期到期日,不允许提前,可将对齐方法修改为:
function ConvertTo-Friday([DateTime]$InputDate) { $offset = 5 - [int]$InputDate.DayOfWeek # 偏移为负说明已过当周周五,向后偏移到下周五 if ($offset -lt 0) { $offset += 7 } return $InputDate.AddDays($offset) }对应示例的2022年10月8日周六,会调整到2022年10月14日周五。
内容的提问来源于stack exchange,提问作者TechFA
相关产品推荐
相关产品推荐

