« SNSについてのメモ。考察はまた今度 | メイン | はじめてOS XのClassic環境が役に立った »

Astro::SunriseのTime::Piece化

日の出と日没時間を計算するモジュールは、Astro::SunriseDateTime::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でみつけた日の出・日の入時刻計算のページなどと比べるとすこしズレがある。
まぁ、厳密に時間を調べないといけない訳ではないのでこれでよし。