Powershell: Sprawdzenie czy data to sobota lub niedziela

25-kwi-2017

Załóżmy, że w swoim skrypcie potrzebujesz rozpoznać, czy dany dzień jest dniem wolnym (sobota lub niedziela) czy roboczym… Proste!

$d = [datetime]::Now
$d.dayofweek

No i świetnie. Wynikiem może na przykład być:

Tuesday

Hmmm, ale czy aby zawsze? Na komputerze z polskimi ustawieniami regionalnymi może zostać zwrócone:

Wtorek

Jeśli chcesz sprawdzić czy dzień jest niedzielą czy sobotą czy innym dniem tygodnia lepszym wyborem byłoby korzystanie z jakiejś wartości liczbowej, gdzie np Niedziela to 0, Poniedziałek to wtorek itp. Da sie coś takiego zrobić. Zrzutuj właściwość DayOfWeek do [int]:

$d = [datetime]::Now
[int]$d.dayofweek

W moim przypadku (wtorek) zwracana wartość to 2. Czy jednak nie będzie tak, że zależnie od ustawień kultury, 0 będzie oznaczać Niedzielę, a w innych warunkach Poniedziałek? Otóż nie!. Jak czytamy na

https://msdn.microsoft.com/pl-pl/library/system.datetime.dayofweek(v=vs.110).aspx

The value of the constants in the DayOfWeek enumeration ranges from DayOfWeek.Sunday to DayOfWeek.Saturday. If cast to an integer, its value ranges from zero (which indicates DayOfWeek.Sunday) to six (which indicates DayOfWeek.Saturday).

The DayOfWeek property returns an enumerated constant; it does not reflect a system’s regional and language settings. To retrieve a string representing a localized weekday name for a particular date, call one of the overloads of the ToString method that includes a format parameter and pass it either the ddd or dddd custom format strings. For details, see How to: Extract the Day of the Week from a Specific Date.

A więc niezależnie od ustawień językowych, regionalnych itp. 0 to zawsze Niedziela a 6 to zawsze Sobota. Wartość stałych można sprawdzić wpisując:

[int][dayofweek]::Sunday
[int][dayofweek]::Monday
[int][dayofweek]::Tuesday
[int][dayofweek]::Wednesday
[int][dayofweek]::Thursday
[int][dayofweek]::Friday
[int][dayofweek]::Saturday

Wynik to oczywiście

0
1
2
3
4
5
6

Jeśli wiec trzeba sprawdzić czy data jest weekendowa wykonaj:

$d = [datetime]::Now
if (($d.DayOfWeek -eq [dayofweek]::Sunday) -or ($d.DayOfWeek -eq [dayofweek]::Saturday))
{
   Write-Output "this is weekend"
}
else
{
   Write-output "this is NOT a weekend"
}

Komentarze są wyłączone

Autor: Rafał Kraik