Skip to content

Instantly share code, notes, and snippets.

@B4Art
Created February 16, 2021 13:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save B4Art/b8f5c7a746e8b12671bd0cbf0be9b4d9 to your computer and use it in GitHub Desktop.
Save B4Art/b8f5c7a746e8b12671bd0cbf0be9b4d9 to your computer and use it in GitHub Desktop.
<#
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