시간 데이터 시리즈: PHP Zmanim으로 시작하기

감사의 말

이 블로그에서는 “유태인 시간(zmanim)”이라고 불리는 개념과 관련된 계산 방법 및 PHP Zmanim 라이브러리를 사용하는 데 필요한 기술에 대해 설명합니다. 이 라이브러리는 유태인 시간을 쉽게 계산할 수 있는 함수들의 모음입니다.

PHPZmanim 라이브러리는 Zachary Weixelbaum가 관리하고 있으며, 현대 기술의 많은 부분과 마찬가지로, PHP Zmanim은 Eliyahu Hershfeld가 개발한 Kosher Java 라이브러리를 기반으로 합니다. Zachary와 Eliyahu에게 큰 감사의 마음을 전합니다. 그들이 라이브러리 개발에 투자한 노력 뿐만 아니라 이를 사용하기 위해 기술적이고 유태교 종교 지침(הלכה)에 대해 숙지하는 데 제공한 지원에 대해서도 말입니다.

서론

이번 주 오후 기도(Mincha)는 언제일까요?” 이는 겉보기에 복잡해 보이는 질문입니다. 왜냐하면 “오후 기도”가 당연한 듯 보이지만, 유태교 종교 규칙(הלכה)과 관련된 많은 것들처럼, 배경, 해석, 특수성에 대한 광대한 양의 요구가 있기 때문입니다.

참고: 유태인 시간 개념(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”
“Don’t put a stumbling block before the blind”

(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.
    • 일부 전통에서는 새벽(alot hashachar, 또는 일출 전에 수평선 위로 빛이 보이는 “alot”)부터 밤(tzeis hakochavim, 또는 일몰 후에 수평선 위로 빛이 보이지 않는 “tzeis”)까지의 시간을 12등분한 값을 사용한다는 점에 유의하세요. 이후 블로그에서 새벽(alot)과 밤(tzeit)에 대해 좀 더 자세히 다루겠습니다.
  • 계절 분(sha’ot zmaniyot)은 계절 시간의 1/60이며, 계절 시간과 마찬가지로 시계의 분보다 클 수도 있고 작을 수도 있습니다.

보시다시피, 일출과 일몰은 다른 모든 시간 계산의 기본 핵심을 형성하며, 하루 중 중요한 유태인 시간의 많은 부분이 이로부터 직접적으로 유도됩니다. 예를 들어, 어떤 전통에서는 다음과 같은 시간을 찾게 됩니다:

  • 안식일은 금요일 밤 일몰 18분 전에 시작합니다(shkia)
  • 안식일은 토요일 밤 일몰 후 45(또는 50, 또는 72)분에 끝납니다(shkia)
  • …그리고 이와 같이 계속됩니다.

계산에서 “복잡합니다”

일출과 일몰을 확정한 후 다음 단계는 새벽과 밤 두 가지 중요한 시간을 확인하는 것입니다. 새벽(Alot haShachar, 또는 단순히 “Alot”)과 밤(Tzeis hakochavim, 또는 단순히 “Tzeis”)은 일출과 일몰과 같은 방식으로 서로를 대조합니다. 새벽은 수평선 위에 태양은 아니지만 빛이 보이는 순간입니다. 밤은 빛이 더 이상 보이지 않는 순간입니다.

불행히도, 빛의 유무는 매우 주관적이므로 계산 방법이 매우 다양합니다.

  • 어떤 전통에서는 일출 전이나 일몰 후 고정된 시계 분 수를 사용합니다.
  • 다른 사람들은 태양이 지평선 아래로 특정 각도만큼 떨어져 있는 시간을 찾기 위해 천문학을 사용합니다.
  • 다른 사람들은 일출에서 일몰까지의 일조량을 10개의 동등한 부분으로 나눈 다음 일출에서 그 양을 뺐거나 일몰에 더한 공식을 사용합니다.
  • 그러나 다른 사람들은 태양이 수평선 아래에 있는 시간을 “동등한” 날(봄이나 가을 춘분, 이때 햇빛과 어둠의 양이 정확히 같음)에서 측정하여 그 시간과 일출 사이의 차이(시계 분 단위)를 계산하고, 그 분을 해당 날짜의 계절 분(“sha’ot zmaniyot”)에 대해 정규화한 다음, 그 양을 해당 날짜의 일출에서 뺀다(또는 일몰에 그것을 더한다).

혼란스러운가요? 이 섹션의 제목이 말하듯이, “복잡합니다.”

이러한 설명의 요점은 단일한 “올바른” 계산을 정하려는 것이 아니라, 각 유형의 계산의 궁극적인 목적을 이해하는 데 도움이 되고, 서로 다른 유대인 전통이 각 계산을 얻는 다양한 방법을 이해하도록 돕는 것입니다.

복잡한 시간들

여러분이 새벽(alot), 일출(netz), 일몰(shkia), 그리고 밤(tzeis)을 알게 되면, 다른 중요한 일일 시간을 계산할 수 있게 됩니다. 이에 포함되는 것들은:

  • 오후 기도의 최초 시간(Mincha Gedola), 이는 종종 새벽이나 일출 후 특정 계절 시간(sha’ah) 수로 계산됩니다. 이 시간의 요점은 오후(말 그대로 한낮 이후)가 시작되는 가장 빠른 순간입니다.
  • 오후 기도의 선호 시간(Mincha ketana), 이는 일출(netz)이나 새벽(alot) 후 더 많은 계절 시간(sha’ah) 수로 계산됩니다. 여기서 요점은 하루의 3/4 이상을 지난 시점으로, 분명히 오후이지만 우연히 밤(tzeis)이 되는 위험이 없는 것입니다.
  • 오후 기도의 최신 시간(Plag haMincha 또는 “plag”)은 종종 오후 기도의 가장 좋은 시간(mincha ketana)과 밤(tzeis) 사이의 시간으로 계산됩니다.

다른 블로그에서 다룰 몇 가지 중요한 시간들이 있지만, 이것들만으로도 시작하기에는 충분합니다.

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

이 작업은 두 가지를 수행합니다:

  1. 첫째, 현재 디렉토리에 composer.json 파일을 생성하고, PHP Zmanim이 설치되어야 함을 지정합니다.
  2. 실제로 PHP Zmanim을 현재 디렉토리 내의 ./vendor 디렉토리에 설치합니다. 추가적인 단계가 필요하지 않습니다.

다른 “composer”와 관련된 항목은 업데이트가 필요한 경우, /phpzmanim_test 디렉토리(또는 선택한 다른 이름)로 이동하여 composer update 명령어를 입력하면 된다는 것입니다. 이 명령어는 composer.json 파일의 정보를 읽어들여 해당 내용을 업데이트합니다.

(스포일러: 이는 composer.json 파일을 삭제하지 말아야 함을 의미합니다. 그러나 애플리케이션의 나머지 부분과 함께 원격 사이트에 복사할 필요는 없습니다.)

이 작업이 완료되면, PHP Zmanim 라이브러리를 사용할 모든 PHP 스크립트에 다음 줄을 포함시켜야 합니다:

PHP

 

require 'vendor/autoload.php';

PHP Zmanim으로 시작하기

이제 PHP Zmanim이 설치되었으니, 이를 사용하여 코드를 작성할 준비가 되었습니다.

이렇게 하려면 먼저 다양한 함수에 전달되는 데이터 컬렉션(실제로 배열)인 PHP 객체를 생성해야 합니다. 이 객체에는 추출하려는 시간에 대한 특정 날짜와 정확한 위치 정보가 포함되어 있습니다.

"Zmanim::Create()"로 객체 생성하기

시작하기 전에 시간을 요청하는 위치에 대해 몇 가지를 알아야 합니다.

  • 위도와 경도.
  • tz 데이터베이스 형식으로 포맷된 타임존입니다. (예: "America/New_York").
  • 해당 위치의 고도(선택 사항). (스포일러: 고도는 계산에 거의 영향을 주지 않습니다.)
  • 계산할 시간의 연도, 월, 일.

객체를 생성하는 형식은 다음과 같습니다:

PHP

 

$VARNAME = Zmanim::create(YEAR, MONTH, DAY, "NAME OF LOCATION", LATITUDE, LONGITUDE, ELEVATION, "TIME ZONE");

구체적인 예시는 다음과 같습니다:

PHP

 

$zmanim = Zmanim::create(2019, 2, 21, "New York City", 40.850519, -73.929214, 200, "America/New_York");

그리고 그것이 문자 그대로 입력 대신 변수를 사용하여 스크립트로 어떻게 보이는지:

PHP

 

<?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() 함수를 사용하여 출력할 수도 있습니다:

PHP

 

print_r($zmanim);

다음과 같은 출력을 얻게 될 것입니다:

PHP

 

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을 사용하여 특정 시간을 얻는 것은 거의 아니나다같다. 일출 시간을 얻는 것은 다음과 같이 간단하다:

PHP

 

$sunrise = $zmanim->sunrise;

이것에 익숙하지 않거나 사용한 적이 없다면, ->는 객체(데이터 요소들의 모음)를 쿼리하거나 내장 메서드를 사용한다는 것을 나타낸다

이렇게 반환되는 것은 다음과 같다:

PHP

 

2024-12-20 07:48:52

함께 따라오는 사람들을 위해, 지금까지의 완전한 코드는 다음과 같다:

PHP

 

sunrise;
echo "$sunrise\n";
?>

요약

PHP Zmanim에 더 많은 내용을 다룰 예정이지만, 이것으로 적어도 PHP 기반의 스크립트나 웹사이트를 구축하고 정확한 유대인 시간을 표시하는 데 시작하는 데는 충분하다고 생각합니다.

언제나 그렇듯이, 아래 댓글에서 질문, 정정, 칭찬을 환영합니다.

Source:
https://dzone.com/articles/time-data-series-getting-started-with-php-zmanim