Операционная система: «Windows 10 Pro».
Программа «Windows PowerShell», версия 5.1.
В
книжке для начинающих изучать работу в программе «PowerShell» есть такой код:
$date = Get-Date -Date 'November 22'
while ($date.DayOfWeek -ne 'Thursday') {
$date = $date.AddDays(1)
}
Write-Output $date
По утверждению автора он должен возвратить следующее:
Thursday, November 23, 2017 12:00:00 AM
Эта маленькая программа предназначена для поиска даты «Дня благодарения» (по-английски «Thanksgiving Day»). В США этот праздник отмечается ежегодно в четвертый четверг ноября. С этого дня начинается праздничный сезон, который включает в себя Рождество и продолжается до Нового года.
У меня эта программа выдает в программе «Windows PowerShell», в командной строке, следующее:
3 ноября 2022 г. 0:00:00
Почему такая разница?
Тут несколько причин. Во-первых, нужно понимать, что вышеуказанная программа находит дату Дня благодарения только в рамках текущего года для дня запуска этой программы. Автор писал свой учебник в 2017 году, поэтому его результат показал дату Дня благодарения для 2017 года.
Во-вторых, для работы вышеуказанной программы имеют значения настройки, касающиеся культуры выбранного региона. В культуре региона США при указании календарной даты принято указывать сначала название или номер месяца, а затем число месяца. Таким образом, строка 'November 22' интерпретируется программой «Windows PowerShell» в рамках культуры региона США как 22 ноября. Программа «Windows PowerShell» в рамках культуры региона США считает, что в переданной строке номер года опущен, следовательно, имеется в виду текущий год.
Очевидно, что у автора учебника в программе «Windows PowerShell» на момент написания учебника были включены настройки культуры региона США.
У меня в программе «Windows PowerShell» включены настройки культуры региона России. Программа «Windows PowerShell» при таких настройках интерпретирует строку 'November 22' как «ноябрь 2022 года». При данных настройках культуры программа «Windows PowerShell» считает, что номер даты опущен, следовательно, имеется в виду первое число указанного месяца. Таким образом, программа «Windows PowerShell» в итоге интерпретирует строку 'November 22' как 1 ноября 2022 года.
Как работает вышеуказанный скрипт? Он просматривает даты одну за другой от точки отсчета и проверяет, не является ли очередная дата четвергом (по-английски «Thursday»). В случае, если точка отсчета является 22 ноября 2017 года, то первым четвергом после нее оказывается 23 ноября 2017 года. Поэтому у автора учебника скрипт выдал 23 ноября 2017 года. Если точкой отсчета является 1 ноября 2022 года, то первым четвергом после этой даты является 3 ноября 2022 года. Поэтому в моем случае скрипт выдал 3 ноября 2022 года.
Проверить текущую настройку культуры можно с помощью следующей команды в командной строке программы «Windows PowerShell»:
Get-Culture
Как это исправить?
Формально программа отработала без ошибок. Но в моем случае выдала неправильный результат. Я хочу, чтобы скрипт в моем случае находил правильную дату дня Благодарения текущего года (текущим годом сейчас для меня является 2022 год).
1 способ. Зададим верную точку отсчета в рамках культуры региона России. Вот так (красным я отметил изменение по сравнению с оригинальным скриптом):
$date = Get-Date -Date '22 November'
while ($date.DayOfWeek -ne 'Thursday') {
$date = $date.AddDays(1)
}
Write-Output $date
Результат работы этой программы у меня:
24 ноября 2022 г. 0:00:00
Если бы я хотел в рамках культуры региона России получить дату Дня благодарения именно 2017 года, следовало бы указать год конкретно, потому что он не является для меня сейчас текущим:
$date = Get-Date -Date '22 November 17'
while ($date.DayOfWeek -ne 'Thursday') {
$date = $date.AddDays(1)
}
Write-Output $date
Результат работы этой программы у меня:
23 ноября 2017 г. 0:00:00
2 способ. Поменяем настройку культуры региона. Это можно сделать с помощью следующей команды:
Set-Culture
При этом следует иметь в виду два момента. Во-первых, эта команда, введенная в командной строке программы «Windows PowerShell», меняет эту настройку в рамках операционной системы «Windows 10 Pro», а не только для программы «Windows PowerShell».
Проверить эту настройку для операционной системы «Windows 10 Pro» можно через кнопку «Пуск» в левом нижнем углу экрана. При нажатии на кнопку «Пуск» откроется меню, в котором слева есть столбец с кнопками. В этом столбце следует выбрать кнопку с шестеренкой («Параметры»). В открывшемся меню параметров операционной системы следует выбрать пункт «Время и язык». В открывшемся меню слева следует выбрать пункт «Регион». В открывшемся меню есть пункты «Страна или регион» и «Формат региона». Эти пункты могут изменяться независимо друг от друга. Команда Set-Culture меняет пункт «Формат региона».
Во-вторых, ввод команды Set-Culture не изменит настройку региона в текущей сессии работы программы «Windows PowerShell». Измененные настройки будут действовать только в следующих сессиях. Таким образом, после изменения настройки культуры региона с помощью команды Set-Culture текущую сессию программы «Windows PowerShell» следует закрыть, а затем открыть новую сессию и уже работать в ней.
Итак, для смены моей текущей настройки культуры региона с России на США я делаю следующее.
1) Ввожу команду:
Set-Culture en-US
2) Закрываю текущую сессию (окно с программой) «Windows PowerShell».
3) Открываю новую сессию (окно с программой) «Windows PowerShell».
4) Ввожу оригинальный скрипт (без изменений), после чего получаю следующий результат:
Thursday, November 24, 2022 12:00:00 AM
Если бы я хотел получить при этой настройке культуры региона дату Дня благодарения для 2017 года (чтобы повторить в точности результат автора учебника), следовало бы указать еще и 2017 год. Например, так (красным цветом указано изменение по сравнению с оригинальным скриптом):
$date = Get-Date -Date 'November 22 17'
while ($date.DayOfWeek -ne 'Thursday') {
$date = $date.AddDays(1)
}
Write-Output $date
Результат работы этого скрипта при настройке культуры региона США:
Thursday, November 23, 2017 12:00:00 AM
После этих экспериментов я, конечно же, вернул настройку культуры региона России с помощью следующей команды (действует не с текущей, а со следующих сессий работы с программой «Windows PowerShell»):
Set-Culture ru-RU