dimayakovlev.ru


Как узнать знак зодиака для заданной даты в PowerShell

Читатель моих заметок, недавно начавший изучать работу с PowerShell, решил взяться за создание модуля, который поможет ему, как любителю астрологии, делать астрологические расчёты. Так как он только начал изучать PowerShell, первый вопрос, с которым он обратился ко мне: “Как узнать знак зодиака по дате рождения человека?” На это я предложил ему вариант функции, которой решил поделиться со всеми, кому интересна эта тема.

Перед тем как перейти непосредственно к коду функции на PowerShell, приведу таблицу с данными по периодам знаков зодиака, которыми я руководствовался при написании функции.

Латинское названиеРусское названиеСимволДата начала периодаДата окончания периода
1AriesОвен♈︎21 марта20 апреля
2TaurusТелец♉︎21 апреля20 мая
3GeminiБлизнецы♊︎21 мая21 июня
4CancerРак♋︎22 июня22 июля
5LeoЛев♌︎23 июля23 августа
6VirgoДева♍︎24 августа23 сентября
7LibraВесы♎︎24 сентября23 октября
8ScorpiusСкорпион♏︎24 октября22 ноября
9SagittariusСтрелец♐︎23 ноября21 декабря
10CapricornusКозерог♑︎22 декабря20 января
11AquariusВодолей♒︎21 января20 февраля
12PiscesРыбы♓︎21 февраля20 марта

При помощи данных из этой таблицы можно в дальнейшем проконтролировать корректность работы функции.

Код функции

Мой вариант функции, которая принимает дату и возвращает для неё знак зодиака, выглядит так.

Function Get-Zodiac {
    <#
        .SYNOPSIS
            Get latin name or number of zodiac sign for given date.
        .PARAMETER Date
            Specifies the date. Current date is the default.
        .PARAMETER Number
            Specifies to return number of zodiac sign instead of his name.
        .EXAMPLE
            # Get zodiac sign for current date.
            Get-Zodiac
        .EXAMPLE
            Get-Zodiac -Number
        .EXAMPLE
            # Get zodiac sign for given date.
            Get-Zodiac -Date (Get-Date -Month 11 -Day 3)
    #>
    Param (
        [Parameter(Mandatory=$False, ValueFromPipeline=$True)]
        [DateTime]$Date = (Get-Date),
        [Parameter(Mandatory=$False)]
        [Switch]$Number
    )

    $m = $Date.Month
    $d = $Date.Day

    $z = $(Switch ($m) {
        1 { $(If ($d -le 20) { 10 } Else { 11 }) }
        2 { $(If ($d -le 20) { 11 } Else { 12 }) }
        3 { $(If ($d -le 20) { 12 } Else { 1 }) }
        4 { $(If ($d -le 20) { 1 } Else { 2 }) }
        5 { $(If ($d -le 20) { 2 } Else { 3 }) }
        6 { $(If ($d -le 21) { 3 } Else { 4 }) }
        7 { $(If ($d -le 22) { 4 } Else { 5 }) }
        8 { $(If ($d -le 23) { 5 } Else { 6 }) }
        9 { $(If ($d -le 23) { 6 } Else { 7 }) }
        10 { $(If ($d -le 23) { 7 } Else { 8 }) }
        11 { $(If ($d -le 22) { 8 } Else { 9 }) }
        12 { $(If ($d -le 21) { 9 } Else { 10 }) }
    })

    If ($Number) {
        return $z
    } Else {
        return @('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpius', 'Sagittarius', 'Capricornus', 'Aquarius', 'Pisces')[($z - 1)]
    }
}

Первоначальным требованием моего читателя к функции был простой возврат названия знака зодиака. Для большей универсальности я добавил возможность получить не только название, но и номер знака зодиака.

С целью упрощения кода я отказался от возможности передавать функции дату в виде строки, поэтому она требует объект типа DateTime.

Для использования функции скопируйте код и вставьте его в файл профиля PowerShell. Прочитать подробнее об использовании профилей PowerShell можно здесь.

Как работает функция Get-Zodiac

Функция возвращает латинское название или номер знака зодиака для заданной пользователем даты.

Функция принимает два необязательных параметра:

  • -Date - параметр принимает значение типа DateTime. Если функция вызвана без параметра -Date, используется текущая дата;
  • -Number - параметр типа Switch. Если функция вызвана с параметром -Number, вместо названия возвращается номер знака зодиака.

Примеры использования функции Get-Zodiac

Самый простой вариант - получение латинского названия знака зодиака для текущей даты. Для этого достаточно вызвать функцию без передачи параметров.

Get-Zodiac

Для получения латинского названия знака зодиака для определённой даты, функция должна быть вызвана с параметром -Date, которому передаётся объект типа DateTime.

$date = Get-Date -Date "2023-11-01"
Get-Zodiac -Date $date

Или без использования дополнительной переменной.

Get-Zodiac -Date (Get-Date -Date "2023-11-01")

Кроме того, можно вызвать функцию, опустив указание имени параметра -Date.

Get-Zodiac (Get-Date -Date "2023-11-01")

Представление даты, передаваемое командлету Get-Date, может быть задано не только при помощи параметра -Date, но и при помощи трёх параметров -Year, -Month, -Day. Предполагаю, есть сценарии, когда такой вариант представления даты будет удобнее.

Get-Zodiac -Date (Get-Date -Month 11 -Day 1)

Рассмотренные варианты используют конкретную дату, заданную пользователем. Если требуется узнать знак зодиака для даты, которая наступит через определённое количество дней, следует поступить так.

# знак зодиака для даты, которая наступит через 90 дней
Get-Zodiac -Date ((Get-Date).AddDays(90))

Когда надо получить не название, а номер знака зодиака, следует вызывать функцию с параметром -Number.

Get-Zodiac -Number

Например, это может быть удобно, когда вместо латинского названия знака зодиака, требуется русское.

# русское название знака зодиака для текущей даты
$z = @('Овен', 'Телец', 'Близнецы', 'Рак', 'Лев', 'Дева', 'Весы', 'Скорпион', 'Стрелец', 'Козерог', 'Водолей', 'Рыбы')
$z[((Get-Zodiac -Number) - 1)]

В этом примере в переменной $z определяется массив русских названий знаков зодиака, из которого возращается элемент с индексом равным номеру знака зодиака для текущей даты, уменьшенному на единицу. Уменьшение на единицу требуется потому что нумерация элементов массива начинается не с 1, а с 0. Об этом надо помнить всегда, работая с массивами!

Примеры использования и результаты работы функции Get-Zodiac

Я поделился одним из возможных вариантов реализации функции для получения знака зодиака для заданной даты. При необходимсти можно самостоятельно изменить функцию, например, заменить латинские названия на русские или даже использовать Emoji.

@('♈️', '♉️', '♊️', '♋️', '♌️', '♍️', '♎️', '♏️', '♐️', '♑️', '♒️', '♓️')[((Get-Zodiac -Number) - 1)]