use strict; use Date::Indian; use POSIX qw(ceil floor); use Math::Round; my(%FORM, $pair, $value, $name); # Hash FORM wird initialisiert foreach $pair (@ARGV) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } @ARGV = (); my $date = Date::Indian->new( ymd => sprintf("%s-%s-%s",$FORM{'year'},$FORM{'month'},$FORM{'day'}), # ex: ymd => '2003-10-31' tz => sprintf("%s",dec2timezone($FORM{'tz'})), # ex: tz => '-5:30' locn => sprintf("%sE %sN",$FORM{'lat'},$FORM{'long'}) # ex: locn =>'82:30E 17:25N' ); my (@y, $m, $d, $t ) = $date -> ymd(); my ($moonrise, $moonset, $flag) = $date -> moonriseset(); my ($sunrise, $sunset, $flag) = $date -> sunriseset(); $moonrise = dec2hour_minute($moonrise); $moonset = dec2hour_minute($moonset); $sunrise = dec2hour_minute($sunrise); $sunset = dec2hour_minute($sunset); printf "MA $moonrise, MU $moonset|SA $sunrise, SU $sunset"; sub dec2time { my ($Dec,$Hour,$m,$Minute,$s,$Second); $Hour = floor($_[0]); $m = $_[0] - $Hour; $Minute = floor($m*60); $s = ($m*60) - $Minute; $Second = floor($s*60); if($Hour < 10) { $Hour = sprintf("0%s",$Hour); } if($Minute < 10) { $Minute = sprintf("0%s",$Minute); } if($Second < 10) { $Second = sprintf("0%s",$Second); } return $Hour.":".$Minute.":".$Second; } sub dec2hour_minute { my ($Dec,$Hour,$m,$Minute,$s,$Second); $Hour = floor($_[0]); $m = $_[0] - $Hour; $Minute = round($m*60); if($Hour < 10) { $Hour = sprintf("0%s",$Hour); } if($Minute < 10) { $Minute = sprintf("0%s",$Minute); } return $Hour.":".$Minute; } sub dec2timezone { my ($Dec,$Hour,$m,$Minute,$s,$Second,$minus); if($_[0] < 0) { $Hour = floor(abs($_[0])); $m = abs($_[0]) - $Hour; $minus = -1; } else { $Hour = floor($_[0]); $m = $_[0] - $Hour; $minus = 1; } $Minute = round($m*60); if($Minute < 10) { $Minute = sprintf("0%s",$Minute); } $Hour = $minus * $Hour; return $Hour.":".$Minute; }