Created
February 16, 2021 13:05
-
-
Save B4Art/b8f5c7a746e8b12671bd0cbf0be9b4d9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
Place this file in the Modules Folder under .\Get-ISOWeek | |
The subfolder should have the same name as this File | |
#> | |
<# | |
Write-Host " Culture: " -NoNewline | |
(20..31).ForEach( { Get-ISO8601Week("2012-12-$($_)") -Verbose }) + ((1..7).ForEach( { Get-ISO8601Week("2013-1-$($_)") -Verbose })) -join ', ' | |
#> | |
function Get-ISOWeek { | |
Param( | |
[Parameter( | |
# Mandatory, | |
ValueFromPipeline, | |
ValueFromPipelineByPropertyName, | |
HelpMessage = 'Valid Date' | |
)] | |
[Alias('DT', 'DateTime')] | |
[datetime[]]$Dates = (Get-Date), | |
[Validateset('Culture', 'UICulture', 'InvariantCulture')] | |
[string]$Culture | |
) | |
<# | |
First create an integer(0/1) from the boolean, | |
"Is the integer DayOfWeek value greater than zero?". | |
Then Multiply it with 4 or 6 (weekrule = 0 or 2) minus the integer DayOfWeek value. | |
This turns every day (except Sunday) into Thursday. | |
Then return the ISO8601 WeekNumber. | |
#> | |
BEGIN { | |
$Cult = Switch ($Culture) { | |
'UICulture' { | |
Get-UICulture | |
Break | |
} | |
'InvariantCulture' { | |
[CultureInfo]::InvariantCulture | |
Break | |
} | |
default{ | |
Get-Culture | |
} | |
} | |
$WeekRule = $Cult.DateTimeFormat.CalendarWeekRule.value__ | |
$FirstDayOfWeek = $Cult.DateTimeFormat.FirstDayOfWeek.value__ | |
} | |
PROCESS{ | |
ForEach ($DateElement in $Dates) { | |
Try { | |
Write-Verbose "------------------------" | |
Write-Verbose "Try to turn $DateElement into ISO8601Week" | |
$WeekRuleDay = [int]($DateElement.DayOfWeek.Value__ -ge $FirstDayOfWeek ) * ( (6 - $WeekRule) - $DateElement.DayOfWeek.Value__ ) | |
$WeekNumber = $Cult.Calendar.GetWeekOfYear(($DateElement).AddDays($WeekRuleDay), $WeekRule, $FirstDayOfWeek) | |
<# | |
So generate the week of day numbers 1..7 based on culture firstdayofweek value and then pick the day of today as an index | |
#> | |
$DayNumber = (0..6).ForEach( { (($_ - $FirstDayOfWeek + 7) % 7) + 1 })[$DateElement.DayOfWeek.value__] | |
$Properties = @{ | |
Date = Get-Date($DateElement) | |
DayOfWeek = (Get-Date($DateElement)).DayOfWeek | |
WeekRuleDay = $WeekRuleDay | |
WeekNumber = $WeekNumber | |
ISOWeek = "$($DateElement.Year)-W$WeekNumber" | |
ISOWeekDay = "$($DateElement.Year)-W$WeekNumber-$DayNumber" | |
ISO8601Week = "$($DateElement.Year)-W$WeekNumber" | |
ISO8601WeekDay = "$($DateElement.Year)-W$WeekNumber-$DayNumber" | |
} | |
} Catch { | |
Write-Verbose "Could not turn: $DateElement into ISO8601Week" | |
$Properties = @{ | |
Date = $DateElement | |
DayOfWeek = '' | |
WeekRuleDay = '' | |
WeekNumber = '' | |
ISOWeek = '' | |
ISOWeekDay = '' | |
ISO8601Week = '' | |
ISO8601WeekDay = '' | |
} | |
} Finally{ | |
Write-Verbose "Final" | |
$Obj = New-Object -Typename PSCustomObject -Property $Properties | |
Write-Output $Obj | |
} | |
} | |
} | |
END{} | |
} | |
<# | |
(20..31).ForEach( { Get-WeekNumber("2012-12-$($_)") -Verbose }) + ((1..7).ForEach( { Get-WeekNumber("2013-1-$($_)") -Verbose })) -join ', ' | |
#> | |
function Get-WeekNumber { | |
Param( | |
[Parameter( | |
# Mandatory, | |
ValueFromPipeline, | |
ValueFromPipelineByPropertyName, | |
HelpMessage = 'Valid Date' | |
)] | |
[Alias('Date', 'DateTime')] | |
[datetime[]]$Dates = (Get-Date) | |
) | |
BEGIN { | |
$FirstDayOfWeek = (Get-Culture).DateTimeFormat.FirstDayOfWeek.value__ | |
} | |
PROCESS { | |
ForEach ($DateElement in $Dates) { | |
Try { | |
Write-Verbose "------------------------" | |
Write-Verbose "Try to turn $DateElement into ISO8601Week" | |
$WeekNumber = [System.Globalization.ISOWeek]::GetWeekOfYear($DateElement) | |
$WeekYear = [System.Globalization.ISOWeek]::GetYear($DateElement) | |
<# | |
I need to check the DayNumber formula. The FirstDayOfTheWeek must become 1 | |
In the Netherlands we start with Monday | |
#> | |
$DayNumber = (0..6).ForEach({(($_ - $FirstDayOfWeek + 7) % 7) + 1 })[$DateElement.DayOfWeek.value__] | |
$Properties = @{ | |
Date = Get-Date($DateElement) | |
DayOfWeek = (Get-Date($DateElement)).DayOfWeek | |
WeekNumber = $WeekNumber | |
ISOWeek = "$WeekYear-W$WeekNumber" | |
ISOWeekDay = "$WeekYear-W$WeekNumber-$DayNumber" | |
ISO8601Week = "$WeekYear-W$WeekNumber" | |
ISO8601WeekDay = "$WeekYear-W$WeekNumber-$DayNumber" | |
} | |
} Catch { | |
Write-Verbose "Could not turn: $DateElement into ISO8601Week" | |
$Properties = @{ | |
Date = $DateElement | |
DayOfWeek = '' | |
WeekRuleDay = '' | |
WeekNumber = '' | |
ISOWeek = '' | |
ISOWeekDay = '' | |
ISO8601Week = '' | |
ISO8601WeekDay = '' | |
} | |
} Finally{ | |
Write-Verbose "Final" | |
$Obj = New-Object -Typename PSCustomObject -Property $Properties | |
Write-Output $Obj | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment