perl script to generate a list of Julian day/day of year dates, given start and end.


I discovered myself on a unix system with a ‘date’ utility that only accepts the -u and + parameters, a fairly basic perl install, and lots of archives that are listed by the “Julian day” (day of year) date.

I put together a perl script using the functions I had at my disposal. The script below makes some allowance for a few different formats, but not nearly as much as Date::Manip would have given me. Feedback appreciated.

#!/usr/bin/perl

use Time::Local;
use Getopt::Long;
use strict;



sub getJJJFromParameter
{
	my $dateString = shift; 
	our $mm;
	our $dd;
	our $yyyy;

	if($dateString =~ m/d{1,2}/d{1,2}/d{2,4}/) {
		($mm, $dd, $yyyy) = split(///, $dateString);
	} elsif ($dateString =~ m/d{2,4}-d{1,2}-d{1,2}/) {
		($yyyy, $mm, $dd) = split(/-/, $dateString);
	} elsif ($dateString =~ m/d{1,2}-d{1,2}-d{2,4}/) {
		($mm, $dd, $yyyy) = split(/-/, $dateString);
	}
	$yyyy %= 100;
	$yyyy += 100;

	my @dt = localtime(timelocal(0,0,0,$dd,$mm-1,$yyyy));

	return($dt[7]+1);
}

# main script

my $startDate='';
my $endDate='';
my $startJJJ = 0;
my $endJJJ = 0;

GetOptions('start=s' => $startDate, 'end=s' => $endDate);

if ($startDate == '') {
	exit;	
} else {
	$startJJJ = getJJJFromParameter($startDate); 
}
if ($endDate != '') {
	$endJJJ = getJJJFromParameter($endDate); 
} else {
	$endJJJ = $startJJJ;
}

my $jjj;

printf "%03d to %03dn", $startJJJ, $endJJJ;

for ($jjj=$startJJJ; $jjj <= $endJJJ; $jjj++) {
	printf("%03d ", $jjj);
}

Leave a Reply

%d bloggers like this: