lunar - 달의 위치, 음양력 변환/일출몰/월출몰/별자리/일월식 PHP/8.0.22

소스닫기 | 24절기 계산 | 음양력변환, 일출몰, 월출몰, 별자리, 일월식 계산 | 메시에 관측정보(실시간) | 메시에 관측정보(오늘전체) | deltaT 계산 | 부활절 날짜 계산
<?php
function simple_astro($y$m$d$_location// solar
{
  list(
$lymd,$info) = lunar::tolunar($y,$m,$d); // lunar
  
$lage $info[5];

  list(
$offical,$civil,$nautical,$astronomical,$moreinfo) = solar::sunrise_sunset($y,$m,$d,$_location); // all

  
return array($lymd,$lage,$offical,$civil,$nautical,$astronomical);
}

function 
get_solarename($str)
{
  
$solarename = array ('N'=>'없음''A'=>'금환''T'=>'개기''H'=>'Hybird''P'=>'부분');

  
$name $solarename[$str[0]] ?? '';
  
$size strlen($str);

  for(
$i=1$i<$size$i++)
  {
    
$name .= isset($solarename[$str[$i]]) ? (', or '.$solarename[$str[$i]]) : '';
  }
  if(!
$name$name '없음'// recheck in lunar info

  
return '일식('.$name.')';
}

function 
get_lunarename($str)
{
  
$lunarename = array ('N'=>'없음''t'=>'개기''p'=>'부분''n'=>'반영');

  
$name $lunarename[$str[0]] ?? '';
  
$size strlen($str);

  for(
$i=1$i<$size$i++)
  {
    
$name .= isset($lunarename[$str[$i]]) ? (', or '.$lunarename[$str[$i]]) : '';
  }
  if(!
$name$name '없음'// recheck in solar info

  
return '월식('.$name.')';
}

ob_clean();
require_once 
'_lib/class.astro.php';
require_once 
'_lib/class.calendar.php';
require_once 
'_lib/class.solar.php';
require_once 
'_lib/class.lunar.php';
require_once 
'_lib/class.moonrise.php'// new class
require_once '_lib/func.debug.php';

$_self $_SERVER['SCRIPT_NAME']; //basename($_SERVER['SCRIPT_NAME']);
$title 'lunar - 달의 위치, 음양력 변환/일출몰/월출몰/별자리/일월식';

//echo date('Z T').' ---- ';
$_checkedm[1] = '';
$_checkedl[1] = '';
$_selected    = array('SELECTED');
$_location    0;
$_inputleap   0;

if(
$_POST)
{
  
$_p $_POST['_p'];
  
$_l = array('m' => $_POST['_l']['m'] ?? 0'l' => $_POST['_l']['l'] ?? 0);
  
$_checkedm[$_l['m']] = 'CHECKED';
  
$_checkedl[$_l['l']] = 'CHECKED';
  
$_inputleap $_l['l'];
  
$_time calendar::_mktime(21,0,0,(int)$_p['m'],(int)$_p['d'],(int)$_p['y']); // local time 21:00 (UTC 12:00)
  
$_location = (int)($_POST['_location'] ?? 0);
  
$_selected[$_location] = 'SELECTED';
  
setcookie('_lloc',$_location,time()+86400*365,'/','.'.$_SERVER['HTTP_HOST']);
}
else
{
  
$_time mktime(21,0,0); // local time 21:00 (UTC 12:00)
  
if(isset($_COOKIE['_lloc']))
  {
    
$_location = (int)$_COOKIE['_lloc'];
    
$_selected[$_location] = 'SELECTED';
  }
}

$_w = array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$_locations astro::location_kr(NULL);
$phpv  'PHP/'.PHP_VERSION;

echo <<<___END
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>
$title</TITLE><P><H2>$title $phpv</H2>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<SCRIPT LANGUAGE="JavaScript" type="text/JavaScript">
<!--
var starttime = (new Date()).getTime();
var year = 0;
function check_leap(obj)
{
  var leap = obj.elements["_l[l]"].checked;
  if(leap) obj.elements["_l[m]"].checked = true;
}
function check_lunar(obj)
{
  var lunar = obj.elements["_l[m]"].checked;
  if(!lunar) obj.elements["_l[l]"].checked = false;
}
//-->
</SCRIPT>
<STYLE TYPE="text/css">
<!--
  * { font-family:NanumGothic,'나눔고딕','Malgun Gothic',Dotum,'돋움',Gulim,'굴림',Helvetica,Apple-Gothic; }
  body, td { font-size:10pt; }
  input, select { background-color:#ffffff; border:solid 1px #4f7292; margin:0 0 0 0; height:30px; }
  input[type="checkbox"] {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background: #fff;
    border-radius: 4px;
    cursor: pointer;
    height: 16px; width: 16px;
    vertical-align: middle; 
    margin: 0 0.2em 0 0;
    outline: 0; }
  input[type="checkbox"]::after {
    border: solid #fff;
    border-width: 0 2px 2px 0;
    content: '';
    display: none;
    height: 40%; width: 15%;
    left: 40%;
    position: relative;
    top: 20%;
    transform: rotate(45deg); }
  input[type="checkbox"]:checked {
    background: #505bf0; }
  input[type="checkbox"]:checked::after {
    display: block; }

  td    { font-family:Helvetica; }
  table { background-color:#bbbbbb; } /*  border:1px solid #cccccc; */
  tr    { background-color:#ffffff; }

  .bb { background-color:dodgerblue; }
  .dayyear { background-color:#c9d8ff; }
  .small { Helvetica; white-space: pre; font-size:9pt; }
  .code {
    /* display: block | table-cell | inline-table; */
    display: table-cell; vertical-align: middle; 
    padding: 10px;
    margin: 10px 5px 20px 5px;  /* 상, 우, 하, 좌 */ /* 바깥쪽 여백임 */
    background: #eeeeee;
    border-radius: 0.5em / 0.5em;
    font-family: Dotumche,monospace; white-space: pre;
    width:800px; }
  .pre-fontspace  { font-family:Dotumche,Helvetica,monospace; white-space: pre; }
  .pre-font  { font-family:Dotumche,Helvetica,monospace; }
  .pre-space { white-space: pre; }
  .solidbox {
    display: table-cell; vertical-align: middle;
    padding: 10px;
    margin: 10px 5px 20px 5px;  /* 상, 우, 하, 좌 */ /* 바깥쪽 여백임 */
    background: #eeeeee;
    border-radius: 0.5em / 0.5em; } /* 모서리 둥글게 */
//-->
</STYLE>
</HEAD>
<BODY>\n
___END;

//echo "\n" . ini_get('default_charset');

$_menuindex = array
(
  
'solar.php'         => '24절기 계산',
  
'lunar.php'         => '음양력변환, 일출몰, 월출몰, 별자리, 일월식 계산',
  
'messier.php'       => '메시에 관측정보(실시간)',
  
'messier.today.php' => '메시에 관측정보(오늘전체)',
  
'deltat.php'        => 'deltaT 계산',
  
'easter.php'        => '부활절 날짜 계산'
);

$menu '';
foreach(
$_menuindex AS $k=>$v$menu .= " | <A HREF='$k'>$v</A>";

if(isset(
$_GET['view']))
{
  echo 
'<A HREF="'.$_self.'">소스닫기</A>'.$menu.'<HR>'."\n";
  
highlight_file(basename($_self));
  return;
}

// rewrite
list($ymd,$_p['y'],$_p['m'],$_p['d'],$w) = explode(' ',calendar::_date('Y-m-d Y n j w',$_time));

$_err '';
if(isset(
$_l['m']) && $_l['m']) // 입력값이 음력일 경우
{
  list(
$ymd,$ck,$y,$m,$d,$w) = lunar::tosolar($_p['y'],$_p['m'],$_p['d'],$_l['l']);
  if(!
$ck$_err '<FONT COLOR=#FF0000>input date --> invalid date</FONT>';
  
$_time calendar::_mktime(21,0,0,$m,$d,$y); // overwrite, local time 21:00 (UTC 12:00)
} else
{
  
$y $_p['y'];
  
$m $_p['m'];
  
$d $_p['d'];
}

//print_r(date('Y m d w l W',$_time));
//echo "$y $m $d ";

list($_ymd,$_info,$s,$f,$n) = $lunar lunar::tolunar($y,$m,$d);
list(
$_y,$_m,$_d,$_l,$_t,$_a,$_e) = $_info// 음력 날짜

//_print_r($lunar);

$_ly $_y;
$_lm $_m 1//  음력, 다음 달 합삭일
if($_lm 12) { $_lm -= 12$_ly++; }

## BC patch
##
//$_fymd = explode(' ',calendar::_date('Y n d',$f[2])); // BC(-year) bug patch
$_fymd explode('-',$f[0]);
if(isset(
$_fymd[3])) { array_shift($_fymd); $_fymd[0] *= -1; }
list(
$_lf) = lunar::tolunar($_fymd[0],$_fymd[1],$_fymd[2]); // 이번달 망시각일(음력)

$_ls sprintf('%d-%02d-%02d',$_y,$_m,1);    // 이번달 합삭일(음력)
$_ln sprintf('%d-%02d-%02d',$_ly,$_lm,1);  // 다음달 합삭일(음력)

$leap    $_l '<FONT COLOR=#FF0000>윤달</FONT>' '평달';
$leaperr = (!$_l AND $_inputleap) ? '<FONT COLOR=#FF0000>윤달아님</FONT>' '';

$w $_w[$w]; // weekday

$e_c get_solarename($_e).', '.get_lunarename($_e);
$e_s get_solarename($s[3]);
$e_f get_lunarename($f[3]);
$e_n get_solarename($n[3]);

$_stime calendar::_mktime(21,0,0,$m,$d,$y);  // local time 21:00 (UTC 12:00)
$moon   lunar::moon($_stime);
$sun    solar::sun($_stime);
$zodiac lunar::zodiac($y,$m,$d,0,0,1);  // to utf-8

## 일출/일몰, 박명(twilight)
## http://www.kasi.re.kr/html/study/qna/?f=3&idx=19911
##
list($offical,$civil,$nautical,$astronomical,$moreinfo) = solar::sunrise_sunset($y,$m,$d,$_location); // all
$scul $moreinfo[0]." ($moreinfo[3])";

## 월출몰
$mrst  moonrise::riseset($y,$m,$d,$_location,1); // 오늘(t)
$mrise $mrst[1] ? $mrst[1] : $mrst[4];
$mset  $mrst[0] ? $mrst[0] : $mrst[3];
$mcul  $mrst[2]." ($mrst[5])";  // 남중

echo '<A HREF="'.$_self.'?view=1">소스보기</A>'.$menu.'<HR>'."\n";

echo <<<__END
<H2>데모 - 태양과 달</H2>
<div class="solidbox pre-font pre-space">- 유효기간: 양력 1902-01-10 ~ 2038-01-18
- 유효기간: 음력 1901-12-01 ~ 2037-12-14</div>

<p>
<FORM METHOD=post>
<div class="solidbox pre-space" style="width:800px;"
>날짜 설정: <INPUT TYPE=text NAME='_p[y]' VALUE='
$_p[y]' SIZE=5 MAXLENGTH=5
>년<INPUT TYPE=text NAME='_p[m]' VALUE='
$_p[m]' SIZE=2 MAXLENGTH=2
>월<INPUT TYPE=text NAME='_p[d]' VALUE='
$_p[d]' SIZE=2 MAXLENGTH=2
>일   <INPUT TYPE=checkbox NAME='_l[m]' VALUE=1 
$_checkedm[1] onClick='check_lunar(this.form)'
>음력 <INPUT TYPE=checkbox NAME='_l[l]' VALUE=1 
$_checkedl[1] onClick='check_leap(this.form)'
>윤달,  위치(관측지): <SELECT NAME='_location'>
__END;
foreach(
$_locations AS $i=>$arr)
{
  echo 
'<OPTION VALUE='$i ' ' . ($_selected[$i] ?? '') . '>'$arr[2] . "\n";
}

$setloc $_locations[$_location][2];

echo <<< __END
</SELECT><BR>
<INPUT TYPE=submit VALUE='  계산하기(Submit)  '
> <INPUT TYPE=button VALUE=' 초기화(Reset) ' OnClick='location.href="
$_self"'>
</div>
</FORM>
<p>
<div class="code">
<b>[결과]</b>
<FONT COLOR=#0000FF>
- 양력: 
$ymd ($w$_err
- 음력: 
$_ymd ($w$leap ${_t}일 $_err $leaperr
- 정보: 월령: 
${_a}$e_c
- 이번달 합삭(초하루): 
$s[0] $s[1](양력), ${_ls}(음력) $e_s
- 이번달 망(음력보름): 
$f[0] $f[1](양력), ${_lf}(음력) $e_f
- 다음달 합삭(초하루): 
$n[0] $n[1](양력), ${_ln}(음력) $e_n
- 일출일몰: 
$offical[0] / $offical[1] $setloc 남중 $scul
- 월출월몰: 
$mrise / $mset $setloc 남중 $mcul
- 시민박명: 
$civil[0] / $civil[1] $setloc
- 항해박명: 
$nautical[0] / $nautical[1] $setloc
- 천문박명: 
$astronomical[0] / $astronomical[1] $setloc
- 별자리: 
$zodiac[0]$zodiac[1]
</FONT>
</div>
__END;

echo 
"<p><div class=code>\n";
echo 
"일출/남중/기타: "print_r($moreinfo);
echo 
"월출/월몰/남중: "print_r($mrst);
echo 
"</div><p>\n";

$_today sprintf('%04d%02d%02d',$y,$m,$d); // solar
$_tyear $y;
$_pdtime $_time// print debug time

echo "<TABLE CELLPADDING=3 CELLSPACING=1 BORDER=0 WIDTH=820>\n";
echo 
"<TR><TD>날짜</TD><TD align=center>요일</TD><TD>음력</TD><TD align=right>월령<br>(UTC 12:00)</TD>".
    
"<TD align=center>월출몰</TD><TD align=center>일출몰</TD>".
    
"<TD align=center>시민박명</TD><TD align=center>천문박명</TD><TD>Debug utime</TD></TR>\n";

for(
$i=-8$i<=31$i++)
{
  
$t 86400 $i;

  list(
$ay,$am,$ad,$aw) = explode(' ',calendar::_date('Y m d D',$_pdtime+$t));
  
$class = ("$ay$am$ad== $_today) ? 'class=dayyear' '';

  
// 음력,월령,일출몰,박명시간
  
$astro simple_astro($ay,$am,$ad,$_location);

  
// 월출몰
  
$mrst moonrise::riseset($ay,$am,$ad,$_location,1);
  
$mrise$mrst[1] ? $mrst[1] : ($mrst[4] ? $mrst[4] : '---');
  
$mset $mrst[0] ? $mrst[0] : ($mrst[3] ? $mrst[3] : '---');

  echo 
"<TR $class>";
  echo 
"<TD>$ay-$am-$ad</TD><TD align=center>$aw</TD><TD>$astro[0]</TD><TD align=right>$astro[1]</TD>".
    
"<TD align=center>$mrise / $mset</TD>".
    
'<TD align=center>'.$astro[2][0].' / '.$astro[2][1].'</TD>'.
    
'<TD align=center>'.$astro[3][0].' / '.$astro[3][1].'</TD>'.
    
'<TD align=center>'.$astro[5][0].' / '.$astro[5][1].'</TD>'.
    
'<TD class=small>'.calendar::_date('Y-m-d H:i:s',$_pdtime+$t).' '.($_pdtime+$t).'</TD>'// debug
    
"\n</TR>\n";
}
echo 
"</TABLE><HR width=90% align=left>\n";

## find blue moon
##
$bluemoon $solareclipse = array();
$_by $y 3// start -3 year
$_bm $m;
$_bd 1;
for(
$i=0$i<82$i++)
{
  list(,,
$_bfirst,$_bmfull,$_bnext) = lunar::tolunar($_by,$_bm,$_bd);
  list(
$_bmfully,$_bmfullm) = explode('-',$_bmfull[0]);

  
$tmp sprintf('%04d%02d',$_bmfully,$_bmfullm);
  
$bluemoon[$tmp][] = array($_bmfull[0],$_bmfull[1],$_bmfull[3]);
  list(
$_by,$_bm,$_bd) = explode('-',$_bnext[0]); // next

  
if($_bfirst[3] != 'N'$solareclipse[$tmp] = array($_bfirst[0],$_bfirst[1],$_bfirst[3]);
}

## print blue moon
##
echo <<<___END
<p>
<div class=code>
--------------------------+----------------------------
Solar Eclipse             | Lunar Eclipse
--------------------------+----------------------------
T - 개기일식(달의 본영)   | t - 개기월식(지구의 본영)
A - 금환일식(달의 본영)   |
H - Hybrid(금환/개기일식) |
P - 부분일식(달의 반영)   | p - 부분월식(지구의 본영)
                          | n - 반영식(지구의 반영)
--------------------------+----------------------------
* 달이 태양을 걸쳐서 기나가는 경우 부분일식(달의 반영이 지구에 도달)
* 달이 지구 분영에 걸쳐서 지나가는 경우 부분월식
* Penumbra: 지구나 달의 반영(그림자)
* Umbra: 지구나 달의 본영(그림자)
* Antumbra: 반음영, 본영의 역그림자(?)
</div>
<p>
<TABLE CELLPADDING=3 CELLSPACING=1 BORDER=0 WIDTH=820>
<TR><TD COLSPAN=3>new moon</TD><TD COLSPAN=3>full moon</TD><TD COLSPAN=3 class=bb>2'nd full moon (blue moon)</TD></TR>
<TR>
<TD>date</TD><TD>time</TD><TD>eclipse</TD>
<TD>date</TD><TD>time</TD><TD>eclipse</TD>
<TD class=bb>date</TD><TD class=bb>time</TD><TD class=bb>eclipse</TD>
</TR>
___END;

foreach(
$bluemoon AS $k=>$arr)
{
  
$tr $fr $er FALSE;
  list(
$_pyear) = explode('-',$arr[0][0]);
  
$class = ($_tyear == $_pyear) ? 'class=dayyear' '';

  if(@
$solareclipse[$k])
  {
    echo 
"<TR $class><TD>".$solareclipse[$k][0].'</TD><TD>'.$solareclipse[$k][1].'</TD><TD>'.$solareclipse[$k][2].'</TD>';
    
$tr TRUE;
  }

  if(
$arr[0][2] != 'N')
  {
    if(!
$tr) echo "<TR $class><TD>-</TD><TD>-</TD><TD>-</TD>";
    echo 
'<TD>'.$arr[0][0].'</TD><TD>'.$arr[0][1].'</TD><TD>'.$arr[0][2].'</TD>';
    
$tr $fr TRUE;
  }
  if(isset(
$arr[1]) && $arr[1])
  {
    if(!
$tr) echo "<TR $class><TD>-</TD><TD>-</TD><TD>-</TD>";
    if(!
$fr) echo '<TD>'.$arr[0][0].'</TD><TD>'.$arr[0][1].'</TD><TD>-</TD>'// first moon
    
$eclipse = ($arr[1][2]=='N') ? '-' $arr[1][2];
    echo 
'<TD>'.$arr[1][0].'</TD><TD>'.$arr[1][1].'</TD><TD>'.$eclipse.'</TD></TR>'."\n"// blue moon
    
$tr $fr $er TRUE;
  }
  if(!
$tr) continue;
  if(!
$fr) echo '<TD>-</TD><TD>-</TD><TD>-</TD>';
  if(!
$er) echo '<TD>-</TD><TD>-</TD><TD>-</TD></TR>'."\n";
}
echo 
"</TABLE>\n";

//echo '<SPAN class=pre>'."\n";
echo '<p><div class=code>';
echo 
'test calendar::_mktime() to calendar::_date()'."\n";
echo 
'-4100-02-29 00:00:00 to '.calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,-4100)).' '.calendar::_mktime(0,0,0,2,29,-4100) ."\n";
echo 
'-100-02-29 00:00:00 to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,-100))."\n";
echo 
'-111-02-29 00:00:00 to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,-111))."\n";
echo 
'0000-02-29 00:00:00 to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,0000))."\n";
echo 
'1000-02-29 00:00:00 to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,1000))."\n";
echo 
'2000-02-29 00:00:00 to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,2000))."\n";
echo 
'3000-02-29 00:00:00 to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,2,29,3000))."\n";
echo 
'2037-12-20-20       to ' .calendar::_date('Y-m-d H:i:s',calendar::_mktime(0,0,0,12,20-20,2037))."\n";
echo 
'</div>';
//echo '</SPAN>'."\n";

//print_r($bluemoon);

echo '<p><div class=code>';
echo 
"<H3>$ymd(음.$_ymd$w</H3>\n";
echo 
'<B>달의 위치(12:00:00):</B>'."\n";
print_r($moon);
echo 
"\n\n";
echo 
'<B>태양의 위치(12:00:00):</B>'."\n";
print_r($sun);
echo 
"\n\n";
echo 
"<B>음력 계산:</B> $_ymd\n";
print_r($lunar);
echo 
"\n\n";
echo 
"<B>별자리:</B>\n";
print_r($zodiac);
echo 
'</div>';


echo <<<__END
<p>
<div class=code>
## lunar object -- get moon position or sun <-> moon, constellation, eclipses
##
## [author]
##  - Chilbong Kim, <san2(at)linuxchannel.net>
##  - http://linuxchannel.net/
##
## [changes]
##  see http://ftp.linuxchannel.net/devel/php_lunar/
##
## [conjunction error by approximative method]
##  - avg: -6538 seconds(+598 seconds, -11787 seconds)
##
## [conjunction error by approximative method day patch]
##  - avg: -368 seconds(+592 seconds, -1081 seconds)
##  - but, wrong day not exists :)
##
## [valid date]
##  - solar : 1902-01-10 - 2038-01-18
##  - lunar : 1901-12-01 - 2037-12-14
##
## [support date]
##  - unix timestamp base: 1902-01-01 00:00:00 <= date <= 2037-12-31 23:59:59 (guess)
##  - JD(Julian Day) base: BC 4713-01-01 12:00 GMT <= Gregorian date <= AD 9999 (guess)
##
## [download & online source view]
##  - http://ftp.linuxchannel.net/devel/php_lunar/
##  - http://ftp.linuxchannel.net/devel/php_calendar/
##
## [demo]
##  - http://linuxchannel.net/gaggle/lunar.php
##
## [docs]
##  - http://linuxchannel.net/docs/lunar.txt
##
## [study]
##  - http://www.kao.re.kr/html/study/qna/index.html
##  - http://sunearth.gsfc.nasa.gov/eclipse/SEsaros/SEsaros.html
##  - Synodic Month (new moon to new moon)     29.53059 days  = 29d 12h 44m (A)
##  - Draconic Month (node to node)            27.21222 days  = 27d 05h 06m (B)
##  - Anomalistic Month (perigee to perigee)   27.55455 days  = 27d 13h 19m
##  - (223 * A) = 6585.36 days, (242 * B) = 6585.32 days 
##  - 1 Saros = 6585.32 days = 18 years 11 days 8 hours
## 
## [eclipses]
##  - Solar Eclipses: T(Total), A(Annular), H(Hybrid(Annular/Total)), P(Partial)
##  - Lunar Eclipses: t(Total), p(Umbral(Partial)), n(Penumbral)
##
## [eclipses(e) by this program]
##  - S A 104 0.010582273616323 1.06751983653440(1.067743)
##  - S T  91 0.014674627401046 1.04166992331860
##  - S H   6 0.210833791736160 0.96121766199154(0.964180)
##  - S P 106 0.829402137331320 1.59530999819400
##  - L t 114 0.010630181434784 0.52538271749109(0.527908)
##  - L p  85 0.294681791935650 1.14183526374750
##  - L n 111 0.832900661071600 1.57436507046800(1.578244)
##
## [reference]
##  - http://user.chollian.net/~kimdbin/re/moonpos.html
##  - http://zimmer.csufresno.edu/~fringwal/skycalc.c
##  - http://williams.best.vwh.net/sunrise_sunset_example.htm
##  - http://aa.usno.navy.mil/faq/docs/SunApprox.html
##  - ftp://ssd.jpl.nasa.gov/pub/eph/export/C-versions/hoffman/
##  - http://www.linuxchannel.net/docs/solar-24terms.txt
##  - http://www.stjarnhimlen.se/english.html  // good 
##  - http://www.stargazing.net/kepler/ // good
##  - http://sunearth.gsfc.nasa.gov/eclipse/eclipse.html // good
##  - http://sunearth.gsfc.nasa.gov/eclipse/phase/phasecat.html
##  - http://sunearth.gsfc.nasa.gov/eclipse/phase/phase2001gmt.html
##  - http://sunearth.gsfc.nasa.gov/eclipse/LEvis/LEaltitude.html
##  - http://sunearth.gsfc.nasa.gov/eclipse/resource.html
##  - http://www.mreclipse.com/Special/SEprimer.html // Solar Eclipses for Beginners
##  - http://www.mreclipse.com/Special/LEprimer.html // Lunar Eclipses for Beginners
##  - http://www.mreclipse.com/MrEclipse.html // for Beginners
##  - http://astronote.org/
##  - http://myhome.naver.com/dudwn1109/appearance/solor_eclipse.htm
##  - http://www.kao.re.kr/html/study/
</div>
__END;

echo 
"\n</BODY>\n</HTML>";
return;
?>

Page loading: 0.00(server) + (network) + (browser) seconds