#!/usr/bin/perl # # Convert day-of-year to month and day-of-month # Convert month and day-of-month to day-of-year use strict; if ( $#ARGV != 1 && $#ARGV != 2 ) { print "Usage: doy year ([yday] | [month] [mday])\n"; exit; } if ( $#ARGV == 1 ) { my ($month, $mday) = &doy2md ($ARGV[0], $ARGV[1]); print "$ARGV[0] : $month : $mday\n"; } elsif ( $#ARGV == 2 ) { my ($yday) = &md2doy ($ARGV[0], $ARGV[1], $ARGV[2]); print "$ARGV[0] : $yday\n"; } ############################################################################ # doy2md: # # Compute the month and day-of-month (mday) from a year and # day-of-year (yday). # # Year is expected to be in the range 1900-2100, jday is expected to # be in the range 1-366, month will be in the range 1-12 and mday # will be in the range 1-31 # # Returns the month and day-of-month (mday) ############################################################################ sub doy2md { # doy2md (year, yday) my $year = shift; my $yday = shift; my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); my $month = -1; my $mday = -1; # Sanity check for the supplied year if ( $year < 1900 || $year > 2100 ) { print "doy2md(): year ($year) is out of range\n"; return; } # Test for leap year my $leap = ( (($year%4 == 0) && ($year%100 != 0)) || ($year%400 == 0) ) ? 1 : 0; # Add a day to February if leap year if ( $leap ) { $days[1]++; } if ( $yday > 365+$leap || $yday <= 0 ) { print "doy2md(): day-of-year ($yday) is out of range\n"; return; } for ( my $idx=0; $idx < 12; $idx++ ) { $yday -= $days[$idx]; if ( $yday <= 0 ) { $month = $idx + 1; $mday = $days[$idx] + $yday; last; } } return ($month, $mday); } # End of doy2md() ############################################################################ # md2doy: # # Compute the day-of-year from a year, month and day-of-month. # # Year is expected to be in the range 1900-2100, month is expected to # be in the range 1-12, mday is expected to be in the range 1-31 and # jday will be in the range 1-366 # # Returns 0 on success and -1 on error. ############################################################################ sub md2doy { # md2doy (year, month, mday) my $year = shift; my $month = shift; my $mday = shift; my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); # Sanity check for the supplied parameters */ if ( $year < 1900 || $year > 2100 ) { print "md2doy(): year ($year) is out of range\n"; return; } if ( $month < 1 || $month > 12 ) { print "md2doy(): month ($month) is out of range\n"; return; } if ( $mday < 1 || $mday > 31 ) { print "md2doy(): day-of-month ($mday) is out of range\n"; return; } # Test for leap year my $leap = ( (($year%4 == 0) && ($year%100 != 0)) || ($year%400 == 0) ) ? 1 : 0; # Add a day to February if leap year if ( $leap ) { $days[1]++; } # Check that the day-of-month jives with specified month if ( $mday > $days[$month-1] ) { print "md2doy(): day-of-month ($mday) is out of range for month $month\n"; return; } $month--; my $yday = 0; for ( my $idx=0; $idx < 12; $idx++ ) { if ( $idx == $month ) { $yday += $mday; last; } $yday += $days[$idx]; } return $yday; } # End of md2doy()