#!/bin/sh
# jd Shell script to calculate the Julian Day number (JD).
#
# The JD is a consecutive count of days from the beginning
# of the year -4712 onwards. Following an astronomical tradition
# Julian Day numbers are counted from noon of each day,
# thus ending in 'nnnn.5' at midnight. The Gregorian
# calendar reform during October 1582 is taken into account.
# The method is valid for negative years but not for
# negative JD numbers.
#
# usage: 'jd
'
# or 'jd - ' (use standard input)
# where: yyyy = Year
# mm = Month
# dd = Day
#
# The shell script takes 3 arguments for day, month and year
# from the command line arguments or from the standard input.
# The year has four digits in our days and the separator
# between arguments is a blank.
#
# Method from: Jean Meeus, Astronomical Formulae for Calculators,
# 3rd Edition, 1985, Willmann-Bell, Inc., Richmond
# ISBN 0-943396-09-3
#
declare -i DAY
declare -i MONTH
declare -i YEAR
declare -i VY
declare -i VM
declare -i VA
declare -i VB
declare -i DSTRING
declare -i JD
if [ "$1" = "-" ] ; then
STDINP="`cat -`"
DAY=`echo $STDINP | cut -d ' ' -f 1`
MONTH=`echo $STDINP | cut -d ' ' -f 2`
YEAR=`echo $STDINP | cut -d ' ' -f 3`
else
if [ $# -lt 3 ] ; then
echo 'Usage: jd ' 1>&2
echo ' jd - (use standard input)' 1>&2
exit 1
else
DAY=$[$1]
MONTH=$[$2]
YEAR=$[$3]
fi
fi
if [ $DAY -lt 1 -o $DAY -gt 31 ] ; then
echo "jd: parameter #1 for day out of range" 1>&2
exit 1
fi
if [ $MONTH -lt 1 -o $MONTH -gt 12 ] ; then
echo "jd: parameter #2 for month out of range" 1>&2
exit 1
fi
if [ $YEAR -eq 1582 -a $MONTH -eq 10 ] ; then
if [ $DAY -gt 4 -a $DAY -lt 15 ] ; then
echo "jd: Warning: Date ${DAY} ${MONTH} ${YEAR} does not \
exist in Gregorian calendar" 1>&2
fi
fi
# This is the start of the calculation
if [ $MONTH -gt 2 ] ; then
VY=$YEAR
VM=$MONTH
else
VY=$[ $YEAR - 1 ]
VM=$[ $MONTH + 12 ]
fi
DSTRING=$[ ($YEAR * 10000) + ($MONTH * 100) + $DAY ]
if [ $DSTRING -ge 15821015 ] ; then
VA=$[ $VY / 100 ]
VB=$[ ($VA / 4) + 2 - $VA ]
else
VA=0
VB=0
fi
VM=$[ $VM + 1 ]
if [ $VY -lt 0 ] ; then
JD=$[ (36525 * $VY - 75) / 100 ]
else
JD=$[ 36525 * $VY / 100 ]
fi
let JD+=$[ 306001 * $VM / 10000 ]
let JD+=$[ $DAY + $VB + 1720994 ]
echo "${JD}.5"
exit 0