如何使用PowerShell 7.x根据周数获取整周日期数组?
根据周数生成整周日期数组(PowerShell 7.x)
我正在使用PowerShell 7.x,想要根据指定年份和周数生成包含整周日期的数组。目前能生成数组并获取日期,但不知道怎么直接返回日期值。
我已经用[System.Globalization.ISOWeek]::ToDateTime([Int32] year,[Int32] week number,[DayOfWeek]:Monday)来获取单天日期,有没有更简洁的方法生成整周日期的数组?
以下是我写的代码:
function fetchWeekDates { $output = @{ Monday =[System.Globalization.ISOWeek]::ToDateTime(2022,1,[DayOfWeek]::Monday)} $output += @{ Tuesday=[System.Globalization.ISOWeek]::ToDateTime(2022,1,[DayOfWeek]::Tuesday)} $output += @{ Wednesday =[System.Globalization.ISOWeek]::ToDateTime(2022,1,[DayOfWeek]::Wednesday)} . . . $output += @{ Sunday =[System.Globalization.ISOWeek]::ToDateTime(2022,1,[DayOfWeek]::Sunday)} return $output }
期望输出:
Output ------- 01-03-2022 01-04-2022 01-05-2022 01-06-2022 01-07-2022 01-08-2022 01-09-2022
优化后的解决方案
你当前的代码重复调用方法,冗余且效率低。可以先获取该周的周一日期,再通过循环依次累加天数生成整周日期,简洁高效:
方法1:封装为可复用函数
function Get-WeekDates { param( [Parameter(Mandatory)] [int]$Year, [Parameter(Mandatory)] [int]$WeekNumber ) # 获取目标周的周一作为起始日期 $monday = [System.Globalization.ISOWeek]::ToDateTime($Year, $WeekNumber, [DayOfWeek]::Monday) # 生成周一到周日的日期数组(0=周一,6=周日) $weekDates = 0..6 | ForEach-Object { $monday.AddDays($_) } # 格式化为指定的MM-dd-yyyy格式输出,若需保留DateTime对象可去掉此步 $weekDates | ForEach-Object { $_.ToString("MM-dd-yyyy") } }
使用示例
Get-WeekDates -Year 2022 -WeekNumber 1
输出结果
01-03-2022 01-04-2022 01-05-2022 01-06-2022 01-07-2022 01-08-2022 01-09-2022
方法说明
- 仅调用一次
ISOWeek::ToDateTime获取目标周的起始周一,避免重复计算 - 用
0..6生成0到6的数字,对应周一之后的0到6天(覆盖整周) - 通过
AddDays()依次生成每天的日期,最终得到完整周的日期数组 - 按需格式化日期,若不需要字符串格式,直接返回
$weekDates即可得到原始DateTime对象数组
简化一行式写法
如果不需要封装函数,可直接用一行代码生成:
$year = 2022; $week = 1; 0..6 | ForEach-Object { [System.Globalization.ISOWeek]::ToDateTime($year, $week, [DayOfWeek]::Monday).AddDays($_).ToString("MM-dd-yyyy") }
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

