kraemer
Goto Top

Powershell - Umrechnung Kalenderwoche zu Datum

Moin zusammen,

irgendwie scheint mir der richtige Suchbegriff zu fehlen.

Ich suche nach einer Möglichkeit, eine Kalenderwoche in ein Datum umzuwandeln - und zwar in den enthaltenen Freitag.

Beispiel: KW 27/2019 -> 05.07.2019

Hat hier jemand einen Tipp für mich?

Gruß

Content-ID: 467951

Url: https://administrator.de/contentid/467951

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

emeriks
emeriks 01.07.2019 aktualisiert um 10:16:52 Uhr
Goto Top
Hi,
ausgehend davon, dass der 1.1. immer in der 1. KW ist, kannst Du schonmal ein Datum in der Zielwoche berechnen.

$JAHR=2019
$KW = 27
$KW_Tag = (Get-Date("01.01.$JAHR")).AddDays(($KW - 1) * 7)  

Davon nun den Wochentag bestimmen und davon wiederum auf den Freitag hochrechnen.

E.

Edit:
DayOfWeek arbeitet mit Basis "Sonntag".
$JAHR=2019
$KW = 27
$KW_Tag = (Get-Date("01.01.$JAHR")).AddDays(($KW - 1) * 7)  
$KW_Freitag = $KW_TAG.AddDays(5 - $KW_Tag.DayOfWeek.Value__)

Edit 2:
Das muss man noch ausfeilen. z.B. berücksichtigen, wenn der 1.1. ein Sa. oder So. ist.
Kraemer
Kraemer 01.07.2019 um 10:21:09 Uhr
Goto Top
Vielen Dank für deinen Ansatz. Ähnlich hatte ich auch schon gedacht.
Leider stimmt folgende Annahme nicht:

Zitat von @emeriks:
ausgehend davon, dass der 1.1. immer in der 1. KW ist, kannst Du schonmal ein Datum in der Zielwoche berechnen.

siehe 1.1.2017 (KW 52) und https://www.aktuelle-kalenderwoche.org/
erikro
erikro 01.07.2019 um 10:21:29 Uhr
Goto Top
Moin,

soweit war ich auch gerade für dieses Jahr:

(get-date("01.01.2019")).adddays(26*7+3)  

Das Problem ist aber nicht nur, dass man in anderen Jahren feststellen muss, wieviel man für den Freitag aufaddieren muss, sondern auch, welches die erste Woche ist. Wenn ich mich recht erinnere, immer dann vom 1.1., wenn der höchstens ein Mittwoch ist, sonst die Woche drauf.

Wenn Du das ausprogrammierst, würde es mich interessieren, das mal zu sehen.

Liebe Grüße

Erik
emeriks
emeriks 01.07.2019 um 10:31:08 Uhr
Goto Top
Zitat von @Kraemer:
siehe 1.1.2017 (KW 52) und https://www.aktuelle-kalenderwoche.org/
Na prima. Dann berücksichtigst Du das eben auch noch.

01.01. --> Wochentag abfragen und KW-Offset festlegen. Falls 01.01. ein Freitag oder höher, dann ist der KW-Offset = 1, sonst = 0.

Ist $KW_Tag ein Sa oder Sonntag dann muss die Berechnung eben "minus" sein, sonst "plus".
emeriks
emeriks 01.07.2019 aktualisiert um 10:38:43 Uhr
Goto Top
$JAHR=2019
$KW = 27

$Neujahr = Get-Date("01.01.$JAHR")  
If( $Neujahr.DayOfWeek.Value__ -gt 5 ) {$KW += 1}

$KW_Tag = $Neujahr.AddDays(($KW - 1) * 7)

If($KW_Tag.DayOfWeek.Value__ -gt 5) {
  $KW_Freitag = $KW_TAG.AddDays($KW_Tag.DayOfWeek.Value__ - 5)
}
Else {
  $KW_Freitag = $KW_TAG.AddDays(5 - $KW_Tag.DayOfWeek.Value__)
}

Das passt auch bei 2017.
colinardo
Lösung colinardo 01.07.2019 aktualisiert um 11:02:11 Uhr
Goto Top
Ich suche nach einer Möglichkeit, eine Kalenderwoche in ein Datum umzuwandeln - und zwar in den enthaltenen Freitag.
function Get-DayOfCalendarWeek([int]$year,[int]$week,[System.DayOfWeek]$weekday){
    $d_jan = Get-Date -Year $year -Day 1 -Month 1 -Hour 0 -Minute 0 -Second 0
    $dOffset = [DayOfWeek]::Thursday - $d_jan.DayOfWeek
    $cal = ([CultureInfo]::CurrentCulture).Calendar
    $firstWeek = $cal.GetWeekOfYear($d_jan.AddDays($dOffset), [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [DayOfWeek]::Monday)
    $week = @{$true=$week-1;$false=$week }[($firstweek -le 1)]
    return $d_jan.AddDays($dOffset).AddDays($week * 7).AddDays($weekday - 4)
}

Get-DayOfCalendarWeek -year 2019 -week 27 -weekday Friday
Grüße Uwe
Kraemer
Kraemer 01.07.2019 um 10:55:15 Uhr
Goto Top
Danke dir. Ich habe mit in der Zwischenzeit folgende Lösung erarbeitet. Nicht ganz schön - aber tut

Function Get-DateOfWeek{
    param ($Week, $Year)
    $DestinationDate=(Get-Date -Day 1 -Month 1 -Year $Year).AddDays(-1)
    $Hit=$false
    while ($Hit -eq $False){
        $DestinationDate=$DestinationDate.AddDays(1)
        if ($DestinationDate.DayOfWeek -eq 5){
            [Int]$WeekOfYear=get-date($DestinationDate) -UFormat %V
            If ($Week -eq $WeekOfYear){$Hit=$True}
        }
    }
    return $DestinationDate
}

Get-DateOfWeek -Week 7 -Year 2017
Kraemer
Kraemer 01.07.2019 um 11:00:24 Uhr
Goto Top
Moin Uwe,

vielen Dank. Den Code muss ich erst einmal debuggen, um den zu verstehen face-smile
Kraemer
Kraemer 24.07.2019 um 10:41:24 Uhr
Goto Top
Moin Uwe,

vielen Dank. Astreine Lösung.

Gruß