Как я могу проверить, если сегодня праздник - PullRequest
1 голос
/ 22 сентября 2019

У нас есть несколько сценариев, которые запускаются внутри запланированных задач, которые отправляют нам оповещения по электронной почте, чтобы напомнить нам о необходимости ежедневно выполнять действия в нашей среде.Я хотел бы добавить в скрипт (ы) логику, чтобы определить, отмечается ли сегодня компания в праздничный день, а не отправлять электронное письмо, если оно есть, потому что никто не хочет думать о работе в праздничный день!Вот что я придумала.

Я запускаю код, только если сегодня не выходной день.Я создаю массив со списком установленных выходных, которые не меняются.Затем я проверяю, является ли сегодня один из тех установленных праздников, и если это так, я возвращаю истину.Если это не установленный выходной, то я проверяю, различается ли это как день памяти, день труда и день благодарения.Наконец, я проверяю, является ли это пятницей или понедельником, и если это так - проверяет, выпадает ли установленный праздничный день на выходные и, следовательно, отмечается день раньше или позже.

<#
Company Holidays:
 • New Year’s Day – 1st day of January
 • Memorial Day – Last Monday in May
 • Independence Day – 4th day of July
 • Labor Day – 1st Monday in September
 • Thanksgiving Day – 4th Thursday in November
 • Christmas Day – 25th day of December

Day of Observance: A holiday will be observed on the holiday itself, except when the following conditions apply:
 1. A holiday falling on a Saturday will be observed on the preceding Friday.
 2. A holiday falling on Sunday will be observed on the following Monday.

#>

#We already know it's not a weekend because this code is only invoked if the day of the week does not start with S*.

function fn-get-variable-holiday ($Month, $DayofWeek, $DayofMonth, $IsHoliday)
{
    if ($Month -eq 5)
    {
        if ($DayofWeek -eq 'Monday' -and $DayofMonth -ge 25)
        {
            #it's the first Monday of September, Labor Day
            $IsHoliday = $true
            Return $IsHoliday
            Break
        }
    }

    if ($Month -eq 9)
    {
        if ($DayofWeek -eq 'Monday' -and $DayofMonth -le 7)
        {
            #it's the first Monday of September, Labor Day
            $IsHoliday = $true
            Return $IsHoliday
            Break
        }
    }

    if ($Month -eq 11)
    {
        if ($DayofWeek -eq 'Thursday' -and ($DayofMonth -ge 22 -and ($DayofMonth -le 28)))
        {
            #it's the fourth Thursday of November, Thanksgiving Day
            $IsHoliday = $true
            Return $IsHoliday
        }
    }
}

Function fn-get-weekend-set-holiday ($DayofWeek, $DayofMonth, $IsHoliday) {

    if ($DayofWeek -eq 'Monday') #Check to see if yesterday was a Holiday that we observe today
    {
        $IsHoliday = fn-get-set-holiday -Today $Today.AddDays(-1)
    } 
    elseif ($DayofWeek -eq 'Friday') #Check to see if tomorrow is a Holiday that we observe today
    {
        $IsHoliday = fn-get-set-holiday -Today $Today.AddDays(1)
    }

    Return $IsHoliday
}

Function fn-get-set-holiday ($Today, $SetHolidays, $IsHoliday)
{
    $SetHolidays = @("01/01","07/04","12/25")

    foreach ($H in $SetHolidays)
    {
        if ($today -like "*$H*")
        {
            $IsHoliday = $true
            Return $IsHoliday
            Break
        }
    }
}

Function Main
{
    #$Today = Get-Date
    $Today = (Get-Date).AddDays(67)
    $IsHoliday = $false

    Write-Host "`nToday is $($Today.ToLongDateString())..."

    if (fn-get-set-holiday -Today $Today -SetHolidays $SetHolidays -IsHoliday $IsHoliday)
    { 
        Write-Host "It's a set holiday"
        Return $true
    }
        elseif (fn-get-variable-holiday -Month $Today.Month -DayofWeek $today.DayOfWeek -DayofMonth $Today.Day -IsHoliday $IsHoliday)
        {
            Write-Host "It's a variable holiday"
            Return $true
        }
            elseif (fn-get-weekend-holiday -DayofWeek $today.DayOfWeek -DayofMonth $Today.Day -IsHoliday $IsHoliday)
            {
                Write-Host "It's a weekend holiday"
                Return $true
            }


}


Main

Я ожидаю, что скрипт выдаст True, если сегодня - праздник, и ничего, если это не так.

Не стесняйтесь оставлять отзывы о том, как улучшить скрипт для синтаксиса или эффективности.

1 Ответ

0 голосов
/ 23 сентября 2019

Если у вас нет функциональных проблем с кодом, отправьте его на сайт CodeReview , чтобы получить советы по улучшению стиля или производительности.Тем не менее, это такой полезный алгоритм, я подумал, что было бы весело переписать именно в соответствии с комментариями.

function IsHoliday([datetime] $DateToCheck = (Get-Date)){
  [int]$year =  $DateToCheck.Year
  $HolidaysInYear = (@(
    [datetime]"1/1/$year",
    (23..30 | %{([datetime]"5/1/$year").AddDays($_)}|?{$_.DayOfWeek -eq 'Monday'})[-1],
    [datetime]"7/4/$year",
    (0..6 | %{([datetime]"9/1/$year").AddDays($_)}|?{$_.DayOfWeek -eq 'Monday'})[0],
    (0..29 | %{([datetime]"11/1/$year").AddDays($_)}|?{$_.DayOfWeek -eq 'Thursday'})[3],
    [datetime]"12/25/$year"
  ) | %{$_.AddDays($(If($_.DayOfWeek -eq 'Saturday'){-1}) + $(If($_.DayOfWeek -eq 'Sunday'){+1})) })
  Return $HolidaysInYear.Contains($DateToCheck.Date)
}

Вот код, который я использовал для его проверки:

0..364|%{([datetime]'1/1/2019').AddDays($_)} | ?{IsHoliday $_}

Он получает все дни года и возвращает только те, которые являются выходными.

Выможно немного изменить его, чтобы он возвращал только рабочие дни:

0..364|%{([datetime]'1/1/2016').AddDays($_)} | ?{!(IsHoliday $_) -and !@('Saturday','Sunday').Contains($_.DayOfWeek)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...