-parsedate () {
- date=$1
- ## Parse an ISO8601 DATE, and set YEAR, MONTH, DAY appropriately (and
- ## without leading zeros).
-
- ## Extract the components of the date and trim leading zeros (which will
- ## cause things to be interpreted as octal and fail).
- year=${date%%-*} rest=${date#*-}; month=${rest%%-*} day=${rest#*-}
- year=${year#0} month=${month#0} day=${day#0}
-}
-
-julian () {
- date=$1
- ## Convert an ISO8601 DATE to a Julian Day Number.
-
- parsedate $date
-
- ## The actual calculation: convert a (proleptic) Gregorian calendar date
- ## into a Julian day number. This is taken from Wikipedia's page
- ## http://en.wikipedia.org/wiki/Julian_day#Calculation but the commentary
- ## is mine. The epoch is 4713BC-01-01 (proleptic) Julian, or 4714BC-11-24
- ## proleptic Gregorian.
-
- ## If the MONTH is January or February then set a = 1, otherwise set a = 0.
- a=$(( (14 - $month)/12 ))
-
- ## Compute a year offset relative to 4799BC-03-01. This puts the leap day
- ## as the very last day in a year, which is very convenient. The offset
- ## here is sufficient to make all y values positive (within the range of
- ## the JDN calendar), and is a multiple of 400, which is the Gregorian
- ## cycle length.
- y=$(( $year + 4800 - $a ))
-
- ## Compute the offset month number in that year. These months count from
- ## zero, not one.
- m=$(( $month + 12*$a - 3 ))
-
- ## Now for the main event. The (153 m + 2)/5 term is a surprising but
- ## correct trick for obtaining the number of days in the first m months of
- ## the (shifted) year). The magic offset 32045 is what you get when you
- ## plug the proper JDN epoch (year = -4713, month = 11, day = 24) into the
- ## above machinery.
- jdn=$(( $day + (153*$m + 2)/5 + 365*$y + $y/4 - $y/100 + $y/400 - 32045 ))
-
- echo $jdn
-}
-