From cbc8a1614c4e6512973c40fed570cc18eb995f2a Mon Sep 17 00:00:00 2001 From: Brian Lalonde Date: Mon, 1 Jan 2024 09:58:51 -0800 Subject: [PATCH] Get-Date -UFormat %W does not match reference implementation Fixes #20978 --- .../commands/utility/GetDateCommand.cs | 11 ++- .../Get-Date.Tests.ps1 | 69 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs index 62a2d276ebf6..caa547db1f7e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetDateCommand.cs @@ -524,7 +524,16 @@ private string UFormatDateString(DateTime dateTime) break; case 'W': - sb.Append(dateTime.DayOfYear / 7); + var week = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear( + dateTime, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday); + if(dateTime.DayOfYear < 7 && week > 50) + { + sb.Append("00"); + } + else + { + sb.AppendFormat("{0:00}", week); + } break; case 'w': diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/Get-Date.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/Get-Date.Tests.ps1 index f72f1fc4ddb9..b7fc294ac225 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/Get-Date.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/Get-Date.Tests.ps1 @@ -55,6 +55,75 @@ Describe "Get-Date DRT Unit Tests" -Tags "CI" { Get-Date -Date 1/1/0030 -UFormat %S%T%u%U%w%W%x%X%y%Y%% | Should -Be "0000:00:00202001/01/3000:00:00300030%" } + # Alternate 'week of year' test cases, generated using `date -d $date +%W` on linux + It "using -uformat 'W' produces the correct output (:)" -TestCases @( + @{date="1999-01-03"; week = "00"}, + @{date="1999-01-04"; week = "01"}, + @{date="1999-02-14"; week = "06"}, + @{date="1999-02-15"; week = "07"}, + @{date="1999-12-21"; week = "51"}, + @{date="1999-12-22"; week = "51"}, + @{date="1999-12-27"; week = "52"}, + @{date="1999-12-28"; week = "52"}, + @{date="1999-12-29"; week = "52"}, + @{date="2000-01-01"; week = "00"}, + @{date="2000-01-02"; week = "00"}, + @{date="2000-01-03"; week = "01"}, + @{date="2000-01-04"; week = "01"}, + @{date="2000-12-20"; week = "51"}, + @{date="2000-12-21"; week = "51"}, + @{date="2000-12-25"; week = "52"}, + @{date="2000-12-26"; week = "52"}, + @{date="2000-12-27"; week = "52"}, + @{date="2000-12-28"; week = "52"}, + @{date="2001-01-01"; week = "01"}, + @{date="2001-01-02"; week = "01"}, + @{date="2005-12-28"; week = "52"}, + @{date="2005-12-29"; week = "52"}, + @{date="2006-01-01"; week = "00"}, + @{date="2006-01-02"; week = "01"}, + @{date="2006-10-13"; week = "41"}, + @{date="2006-10-16"; week = "42"}, + @{date="2012-12-28"; week = "52"}, + @{date="2012-12-31"; week = "53"}, + @{date="2013-01-01"; week = "00"}, + @{date="2013-01-02"; week = "00"}, + @{date="2023-12-29"; week = "52"}, + @{date="2024-01-01"; week = "01"}, + @{date="2024-12-28"; week = "52"}, + @{date="2024-12-30"; week = "53"}, + @{date="2024-12-31"; week = "53"}, + @{date="2025-01-01"; week = "00"}, + @{date="2025-01-02"; week = "00"}, + @{date="2025-01-03"; week = "00"}, + @{date="2025-01-04"; week = "00"}, + @{date="2025-01-05"; week = "00"}, + @{date="2025-01-06"; week = "01"}, + @{date="2025-03-09"; week = "09"}, + @{date="2025-03-10"; week = "10"}, + @{date="2025-03-17"; week = "11"}, + @{date="2025-03-24"; week = "12"}, + @{date="2025-03-31"; week = "13"}, + @{date="2025-04-07"; week = "14"}, + @{date="2025-04-14"; week = "15"}, + @{date="2025-10-20"; week = "42"}, + @{date="2025-10-27"; week = "43"}, + @{date="2025-11-03"; week = "44"}, + @{date="2025-11-10"; week = "45"}, + @{date="2025-11-17"; week = "46"}, + @{date="2025-11-24"; week = "47"}, + @{date="2025-12-01"; week = "48"}, + @{date="2025-12-08"; week = "49"}, + @{date="2025-12-15"; week = "50"}, + @{date="2025-12-22"; week = "51"}, + @{date="2025-12-29"; week = "52"}, + @{date="2026-01-01"; week = "00"}, + @{date="2026-01-02"; week = "00"} + ) { + param($date, $week) + Get-Date -Date $date -UFormat %W | Should -BeExactly $week + } + # The 'week of year' test cases is from https://en.wikipedia.org/wiki/ISO_week_date It "using -uformat 'V' produces the correct output (:)" -TestCases @( @{date="1998-01-02"; week = "01"},