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-Key: 467951

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

Printed on: April 23, 2024 at 18:04 o'clock

Member: emeriks
emeriks Jul 01, 2019 updated at 08:16:52 (UTC)
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.
Member: Kraemer
Kraemer Jul 01, 2019 at 08:21:09 (UTC)
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/
Member: erikro
erikro Jul 01, 2019 at 08:21:29 (UTC)
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
Member: emeriks
emeriks Jul 01, 2019 at 08:31:08 (UTC)
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".
Member: emeriks
emeriks Jul 01, 2019 updated at 08:38:43 (UTC)
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.
Member: colinardo
Solution colinardo Jul 01, 2019 updated at 09:02:11 (UTC)
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
Member: Kraemer
Kraemer Jul 01, 2019 at 08:55:15 (UTC)
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
Member: Kraemer
Kraemer Jul 01, 2019 at 09:00:24 (UTC)
Goto Top
Moin Uwe,

vielen Dank. Den Code muss ich erst einmal debuggen, um den zu verstehen face-smile
Member: Kraemer
Kraemer Jul 24, 2019 at 08:41:24 (UTC)
Goto Top
Moin Uwe,

vielen Dank. Astreine Lösung.

Gruß