Acknowledgments
В этом блоге я объясняю концепции и методы, связанные как с расчетом так называемых “еврейских времен” (zmanim), так и с необходимыми навыками использования библиотеки PHP Zmanim – набора функций, позволяющих легко рассчитывать еврейские времена.
Библиотека PHPZmanim поддерживается Захари Вайксельбаум. Как и многие вещи в современном технологиях, PHP Zmanim основывается на фундаментальной библиотеке Kosher Java от Элиаху Хершфельда. Я глубоко признателен как Захари, так и Элиаху — не только за их вклад в разработку этих библиотек, но и за поддержку, которую они оказали мне, пока я осваивал технические и еврейские религиозные правила (галаху), необходимые для их использования.
Введение
“Во сколько будет вечерняя молитва (Минха) на этой неделе?” — это обманчиво сложный вопрос. Он обманчив, потому что “вечерняя молитва” кажется самоочевидным понятием, но (как и во многих вещах, связанных с еврейскими религиозными правилами (галахой), требуется огромное количество информации, комментариев и специфики.
ПРИМЕЧАНИЕ: Если вы уже комфортно разбираетесь в концепциях еврейского времени (zmanim), не стесняйтесь перейти к разделу “Установка PHP Zmanim”. Я не обижусь и не буду держать это против вас.
Трудно оценить важность точных расчетов времени в иудейском религиозном дне, неделе и жизни. Она влияет на все, от начала и конца поста до того, когда слишком поздно (или слишком рано) произносить определенные молитвы, и до момента, когда владение (не говоря уже о употреблении) хлеба запрещено.
Другими словами, я приведу цитату из книги раввина Авраама Иешауы Хешеля “Шаббат”.
Смысл Шаббата заключается в праздновании времени, а не пространства. Шесть дней в неделю мы живем под тиранией вещей пространства; в Шаббат мы стараемся настроиться на святость во времени.
Rabbi Abraham Joshua Heschel, “The Sabbath”
Даже с таким объяснением некоторые читатели могут все еще удивляться: “Почему так много говорить об этом? Вы хотите сказать, что Бог будет держать это против вас, если вы ошибетесь на 5 минут?”
Это справедливый вопрос, и стоит уделить ему минуту обсуждения, потому что в противном случае потребность в, не говоря уже об эффекте, этого блога (и техник и технологий, которые он описывает) уменьшается.
Нет, конечно, Бог не заботится. Так же, как мой тренер по бегу не “заботится”, если я разомнюсь перед бегом, делаю тренировки в межсезонье или пью достаточно воды. Давайте посмотрим правде в глаза: неважно, как сильно я тренируюсь, мой тренер не будет здоровее. Однако мой тренер – который заботится обо мне больше, чем о моих результатах на следующих соревнованиях, хочет, чтобы Я заботился. Они хотят, чтобы я был полностью предан этому, если только потому, что знают, что мое переживание будет более полноценным из-за этого.
Таким же образом, Бог не “переживает”. Но мы знаем (через тексты Торы и Талмуда), что Бог хочет, чтобы МЫ переживали. И так еврейские ученые на протяжении тысячелетий пытались – используя свидетельства, представленные в тексте – избегать простых и упрощенных ответов, и копать глубже, чтобы раскрыть детали.
Возвращаясь к вопросу на повестке дня: “Во сколько начинаются вечерние молитвы?” Чтобы это понять, нам нужно сначала понять, что определяет “день” (по сравнению с “ночью”); как понять, какая граница отделяет “утро” от “вечера”; как эффективно разделить день на части; и так многое другое.
Хотя в этом блоге будут вводиться некоторые из этих концепций и терминов по мере необходимости, его не следует рассматривать как исчерпывающий ни в коем случае.
Неудивительно, что компьютеры быстро справились с расчетом этих времен, и теперь существует широкий спектр веб-сайтов и приложений, готовых выполнить эту работу за нас. Даже для тех, кто хочет создать свои собственные программы для этих расчетов, есть времясберегающие решения в виде кодовых библиотек, таких как KosherJava и его многочисленные порты, включая PHP, Swift, .Net, JavaScript, Python, и многие другие.
Тем не менее, важно понимать теорию, стоящую за инструментами. Любой, кто хочет создать веб-сайт или приложение, должен быть уверен, что их программа не дает непреднамеренно неправильное время. Хотя, как уже упоминалось ранее, никто не “пойдет в ад” (так сказать) за молитву в неправильное время, существует строгое предписание:
וְלִפְנֵ֣י עִוֵּ֔ר לֹ֥א תִתֵּ֖ן מִכְשֹׁ֑ל וְיָרֵ֥אתָ מֵּאֱלֹהֶ֖יךָ
“lifnei iver lo titein michshol v’yareita mei-elohecha”
“Не ставьте препятствие перед слепым”(Leviticus 19:14)
Если человек ошибается случайно, это одно. Но совсем другое дело – предоставлять ложную информацию, которая заставляет кого-то (или, что еще хуже, МНОГИХ людей) совершать ошибку, полагая, что информация, полученная от вашего приложения, была точной и надежной.
Основные времена
Учитывая это, мы начнем с понимания времен, которые довольно просты и наименее подвержены вариациям в еврейской традиции:
- Рассвет (Netz Hachma) – это обычный навигационный рассвет – момент, когда верхний край диска солнца касается горизонта.
- Закат (Shkia) – это другая сторона ежедневного монеты – момент, когда верхний край солнца опускается чуть ниже горизонта.
- A “seasonal hour” (sha’ah) refers to the even division of daylight, the time between sunrise and sunset. There are always 12 seasonal hours, but they may be longer or shorter than a regular (on your clock) hour because the amount of daylight fluctuates with the season.
- Обратите внимание, что некоторые традиции рассчитывают ша’а как 12 частей времени от рассвета (alot hashachar, или просто “alot”, когда свет виден над горизонтом, но до самого рассвета) до ночи (tzeis hakochavim, или просто “tzeis”, когда свет над горизонтом не виден, после заката). Мы рассмотрим рассвет (alot) и ночь (tzeit) более подробно позже в блоге.
- Сезонные минуты (шаот заманиот) составляют 1/60 сезонного часа и, как и сезонный час, могут быть больше или меньше обычной минуты на вашем часов.
Как видите, восход и закат составляют основу всех других временных расчетов, и множество важных еврейских времен в течение дня выводятся непосредственно из них. Например, в некоторых традициях вы найдете:
- Шаббат начинается в пятницу вечером, за 18 минут до заката (шкия)
- Шаббат заканчивается в субботу вечером через 45 (или 50, или 72) минуты после заката (шкия)
- …и так далее.
Расчеты, где “это сложно”
Как только вы определили восход и закат, следующим шагом является идентификация двух критических времен рассвета и ночи. Рассвет (Алот хаШахар, или просто “Алот”) и ночь (Цейс hакочавим, или просто “Цейс”) отражают друг друга так же, как восход и закат. Рассвет – это момент, когда свет (но не солнце) виден над горизонтом. Ночь – это момент, когда свет уже не виден.
К сожалению, то, есть ли “свет” или нет, является крайне субъективным, и поэтому способы его расчета сильно различаются.
- Некоторые традиции используют фиксированное количество минут до восхода или после заката по часам.
- Другие будут использовать астрономию для определения времени, когда солнце находится под горизонтом на определенное количество градусов.
- Другие будут использовать формулу, например, взяв количество дневного света (от восхода до заката), разделив это на 10 равных частей, и затем вычтя это количество от восхода или добавив к закату.
- Тем не менее, другие возьмут время, когда солнце находится ниже горизонта в день “равноденствия” (то есть во время весеннего или осеннего равноденствия, когда количество солнечного света и темноты точно одинаково), рассчитают разницу (в минутах по часам) между этим временем и восходом солнца, нормализуют эти минуты относительно “сезонных минут” (“шаот цманиот”) для конкретного дня, и, наконец, вычтут это количество из времени восхода солнца (или прибавят это к времени заката) для данного дня.
Звучит запутанно? Как говорится в названии этого раздела, “это сложно”.
Моя цель в описании этих методов не в том, чтобы определить единственный “правильный” способ расчета, а скорее помочь вам понять конечную цель каждого типа расчета – а также для того, чтобы вы понимали, что существует несколько способов, которыми разные еврейские традиции приходят к каждому расчету.
Сложные времена
Как только у вас появляется рассвет (алот), восход солнца (нетц), закат (шкия) и ночь (цеис), становится возможным рассчитать другие важные ежедневные времена. Среди них:
- Самый ранний время для вечерней молитвы (Минха Гдола), которое часто рассчитывается как определенное количество сезонных часов (шаа) после рассвета или восхода солнца. Смысл этого времени в том, что это самый ранний момент, когда наступает “вечер” (буквально, после полудня).
- Предпочтительное время для вечерней молитвы (Минха кетана), которое рассчитывается как большее количество сезонных часов (шаа) после восхода солнца (нетц) или рассвета (алот). Смысл здесь в том, что это более чем на 3/4 пройдено через день, когда ясно, что наступил вечер – но без риска того, что это случайно станет ночью (цеис).
- Последнее время для вечерних молитв (Plag haMincha, или “плаг”), которое часто рассчитывается как время между лучшим временем для вечерних молитв (мина катана) и ночью (цеис).
Хотя есть и другие ключевые моменты, о которых мы поговорим в другом блоге, этого достаточно, чтобы начать.
Установка библиотеки PHP Zmanim
После того как мы разобрались с техническими деталями, мы можем перейти к… техническим деталям! Только на этот раз это ТЕХНИЧЕСКИЕ технические детали. (и для тех людей, которые пропустили всё от введения до этого раздела, ЗДРАВСТВУЙТЕ! Рады вас видеть снова!)
Библиотека PHP Zmanim – это сложная библиотека, которая включает не только импорт Kosher Java в язык PHP, но и некоторые вспомогательные модули, такие как Carbon (инструмент, который помогает быстрее, проще и точнее выполнять преобразования даты и времени); Symfony (фреймворк для веб-дизайна); и несколько других небольших утилит.
Дело в том, что все эти модули работают в сотрудничестве с PHP Zmanim, и вам нужно установить их все, чтобы что-либо работало. Самый простой способ установить их все – использовать утилиту PHP “composer”, которая управляет зависимостями.
Если вам нужно запустить PHP Zmanim на веб-сервере и у вас нет доступа к запуску установщиков в командной строке, вам всё равно повезло. Просто скопируйте каталог ./vendor из локальной установки, и – с некоторыми оговорками – он будет работать.
Каковы эти предостережения? Главное – убедиться, что версия PHP, поддерживаемая вашим хостинг-провайдером, совпадает с той, которую вы используете при установке через Composer.
Это подводит меня к фактической команде установки Composer. Я знаю, что мы еще не дошли до фактического кодирования, но давайте создадим директорию, где будут находиться скрипты. Для этого блога я назову ее /phpzmanim_test.
В окне терминала перейдите в эту директорию:
cd /php zmanim_test
Теперь введите команду:
composer -V
(обратите внимание, что это заглавная V)
Это подтвердит, установлен ли Composer или нет. Если нет, быстро загуглите, чтобы узнать лучший способ его установки на вашу операционную систему.
Далее, введите команду:composer require zachweix/php-zmanim
Это сделает две вещи:
- Во-первых, он создаст файл
composer.json
в текущей директории, с инструкциями о том, что PHP Zmanim должен быть установлен. - На самом деле он устанавливает PHP Zmanim для вас в директорию ./vendor внутри текущей директории. Дополнительных шагов не требуется.
Единственная другая связанная с Composer вещь, которую следует отметить, это то, что если вам когда-нибудь понадобится обновить, вы можете легко сделать это, зайдя в директорию /phpzmanim_test (или в ту, которую вы назвали) и введя команду composer update
. Это прочтет информацию в файле composer.json и обновит все, что найдет там.
(СПОЙЛЕР: это означает, что вы НЕ ДОЛЖНЫ удалять файл composer.json. Однако, если вы не хотите, вам не нужно копировать его на удаленный сайт вместе с остальной частью вашего приложения.)
После выполнения этого шага, вам необходимо добавить следующую строку в каждый PHP-скрипт, который будет использовать библиотеку PHP Zmanim:
require 'vendor/autoload.php';
Начало работы с PHP Zmanim
Теперь, когда PHP Zmanim установлен, вы готовы начать писать код с его использованием.
Для этого сначала создайте объект PHP – набор (на самом деле массив) данных, которые передаются в различные функции. Этот объект содержит как конкретную дату для времени, которое вы хотите извлечь, так и точную информацию о местоположении.
Создание объекта с помощью “Zmanim::Create()”
Прежде чем начать, вам нужно знать несколько вещей о месте, для которого вы запрашиваете времена:
- Широту и долготу.
- Часовой пояс, отформатированный в формате базы данных часовых поясов (пример:
“America/New_York”
). - Высоту над уровнем моря этого местоположения, если вы решите использовать её. (СПОЙЛЕР: очень редко высота влияет на эти расчеты.)
- Год, месяц и день рассчитываемых времен.
Формат для создания вашего объекта следующий:
$VARNAME = Zmanim::create(YEAR, MONTH, DAY, "NAME OF LOCATION", LATITUDE, LONGITUDE, ELEVATION, "TIME ZONE");
Вот конкретный пример:
$zmanim = Zmanim::create(2019, 2, 21, "New York City", 40.850519, -73.929214, 200, "America/New_York");
Как это выглядит в виде скрипта с некоторыми переменными вместо прямого ввода:
<?php
require 'vendor/autoload.php';
use PhpZmanim\Zmanim;
use PhpZmanim\Calendar\ComplexZmanimCalendar;
use PhpZmanim\Geo\GeoLocation;
$getdate = date('Y-m-d');
$getyear = date('Y', strtotime($getdate));
$getmonth = date('m', strtotime($getdate));
$getday = date('d', strtotime($getdate));
$locname = "Beit Knesset Chochmat Shlomo, Beachwood, OH";
$lat = 41.4939407;
$long = -81.516709;
$elev = 0;
$tz = 'America/New_York';
$zmanim = Zmanim::create($getyear, $getmonth, $getday, $locname, $lat, $long, $elev, $tz);
С этим кодом в вашем распоряжении у вас есть объект для сегодняшней даты для указанного местоположения. Вы даже можете распечатать его с помощью функции PHP print_r()
:
print_r($zmanim);
Что должно дать вам вывод, который выглядит примерно так:
PhpZmanim\Zmanim Object
(
[calendar:PhpZmanim\Calendar\AstronomicalCalendar:private] => Carbon\Carbon Object
(
[endOfTime:protected] =>
[startOfTime:protected] =>
[constructedObjectId:protected] => 00000000000000080000000000000000
[localMonthsOverflow:protected] =>
[localYearsOverflow:protected] =>
[localStrictModeEnabled:protected] =>
[localHumanDiffOptions:protected] =>
[localToStringFormat:protected] =>
[localSerializer:protected] =>
[localMacros:protected] =>
[localGenericMacros:protected] =>
[localFormatFunction:protected] =>
[localTranslator:protected] =>
[dumpProperties:protected] => Array
(
[0] => date
[1] => timezone_type
[2] => timezone
)
(есть еще, но вы поняли идею).
Получение Вашего Первого Реального Времени – Восход Солнца (Netz HaHachma)
Как только объект создан, использование его для получения определенных времен через PHP Zmanim почти не вызывает энтузиазма. Получение времени восхода солнца так же просто, как:
$sunrise = $zmanim->sunrise;
Если вы не знакомы с этим или не использовали его раньше, ->
указывает, что вы запрашиваете объект (снова, набор элементов данных) или используете встроенный метод
Это вернет что-то, что выглядит следующим образом:
2024-12-20 07:48:52
Для тех, кто следит, полная кодировка на данный момент выглядит следующим образом:
sunrise;
echo "$sunrise\n";
?>
Итог
Есть еще многое, что нужно рассказать о PHP Zmanim, и я планирую это сделать в ближайшие недели. Но это, по крайней мере, должно помочь вам начать создавать скрипты или сайты на PHP и отображать точные времена для еврейских моментов.
Как всегда, я приветствую вопросы, исправления и комплименты в комментариях ниже.
Source:
https://dzone.com/articles/time-data-series-getting-started-with-php-zmanim