#!/usr/bin/env perl use strict; use warnings; use 5.010; use Astro::Sunrise; use DateTime; use DateTime::Duration; use Getopt::Std; our $VERSION = '0.0'; sub show_usage { my ($exit_status) = @_; say "Usage: $0 [-d ] [-t ] [-ov] "; exit( $exit_status // 0 ); } sub get_rise_and_set { my ( $ts, $lon, $lat, $alt ) = @_; my ( $rise_str, $set_str ) = sunrise( $ts->year, $ts->month, $ts->day, $lon, $lat, $ts->offset / 3600, 0, $alt ); my ( $rise_h, $rise_m ) = ( $rise_str =~ m{(..):(..)} ); my ( $set_h, $set_m ) = ( $set_str =~ m{(..):(..)} ); my $rise = $ts->clone->set( hour => $rise_h, minute => $rise_m, ); my $set = $ts->clone->set( hour => $set_h, minute => $set_m, ); return ( $rise, $set ); } my %opts; getopts( 'd:hot:v', \%opts ); if ( $opts{h} ) { show_usage(0); } if ( @ARGV != 2 ) { show_usage(1); } my ( $latitude, $longitude ) = @ARGV; if ( $opts{d} and not $opts{d} =~ m{ ^ -? [[:digit:]]+ $}x ) { say STDERR "Error: Offset (-d ...) must be a number\n"; show_usage(1); } my $now = DateTime->now( time_zone => 'local' ); my $delta = DateTime::Duration->new( minutes => $opts{d} || 0 ); my $altitude = $opts{t} // Astro::Sunrise::DEFAULT; my ( $sunrise, $sunset ) = get_rise_and_set( $now, $longitude, $latitude, $altitude ); $sunrise->add_duration($delta); $sunset->subtract_duration($delta); if ( $opts{v} ) { say 'rise at ' . $sunrise->hms; say 'now is ' . $now->hms; say 'set at ' . $sunset->hms; } if ( $opts{o} ) { say( ( $now < $sunrise or $now > $sunset ) ? '1' : '0' ); exit 0; } if ( $now < $sunrise or $now > $sunset ) { exit 0; } exit 1; __END__ =head1 NAME =head1 SYNOPSIS =head1 VERSION =head1 DESCRIPTION =head1 OPTIONS =over =back =head1 EXIT STATUS =head1 CONFIGURATION None. =head1 DEPENDENCIES =over =back =head1 BUGS AND LIMITATIONS =head1 AUTHOR Copyright (C) 2012 by Daniel Friesel Ederf@finalrewind.orgE =head1 LICENSE 0. You just DO WHAT THE FUCK YOU WANT TO.