Astro::SunriseのTime::Piece化
日の出と日没時間を計算するモジュールは、Astro::SunriseとDateTime::Event::Sunriseの2つがあるのだが、両方とも、DateTimeを必要とする。
某仕事で使おうと思ってDateTimeをインストールしようとしていたのだが、依存関係が結構あり、面倒。
んで、改造に楽そうなAstro::SunriseからDateTimeを取り除いてみた。
以下Patch
--- AstroSunrise.pm.orig Mon Feb 7 23:13:58 2005 +++ AstroSunrise.pm Mon Feb 7 22:54:08 2005 @@ -1,4 +1,4 @@ -package Astro::Sunrise; +package AstroSunrise; =head1 NAME @@ -83,7 +83,9 @@ use POSIX qw(floor); use Math::Trig; use Carp; -use DateTime; +#use DateTime; +use Time::Piece; +use Time::Seconds; use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $RADEG $DEGRAD ); require Exporter; @@ -614,12 +616,14 @@ my $alt = shift || -0.833; my $offset = int( shift || 0 ); - my $today = DateTime->today->set_time_zone( 'local' ); - $today->add( days => $offset ); - + #my $today = DateTime->today->set_time_zone( 'local' ); + #$today->add( days => $offset ); + my $today = Time::Piece->new; + $today += ONE_DAY * $offset; + my( $sun_rise, undef ) = sunrise( $today->year, $today->mon, $today->mday, $longitude, $latitude, - ( $today->offset / 3600 ), + ( $today->tzoffset / 3600 ), # # DST is always 0 because DateTime # currently (v 0.16) adds one to the @@ -666,12 +670,14 @@ my $alt = shift || -0.833; my $offset = int( shift || 0 ); - my $today = DateTime->today->set_time_zone( 'local' ); - $today->add( days => $offset ); + #my $today = DateTime->today->set_time_zone( 'local' ); + #$today->add( days => $offset ); + my $today = Time::Piece->new; + $today += ONE_DAY * $offset; my( undef, $sun_set ) = sunrise( $today->year, $today->mon, $today->mday, $longitude, $latitude, - ( $today->offset / 3600 ), + ( $today->tzoffset / 3600 ), # # DST is always 0 because DateTime # currently (v 0.16) adds one to the
Astro::SunriseをAstroSunriseというモジュール名に変えてしまいます。あとはライブラリパスが通った場所において、
use AstroSunrise;
あまり確かめていないが、Googleでみつけた日の出・日の入時刻計算のページなどと比べるとすこしズレがある。
まぁ、厳密に時間を調べないといけない訳ではないのでこれでよし。