#!/usr/bin/python

# task to convert a list of julian dates to gregorian dates
# description at http://mathforum.org/library/drmath/view/51907.html
# Original algorithm in Jean Meeus, "Astronomical Formulae for Calculators"

import math, sys, string

if len(sys.argv)==1:
    print "\n Task to convert a list of julian dates to gregorian dates."
    print " Written by Enno Middelberg 2002"
    print "\n Usage: jd2gd.py [-f] date1 date2 date3 ...\n"
    sys.exit()
else:
    print "\n Task to convert a list of julian dates to gregorian dates."
    print " Written by Enno Middelberg 2002\n"
    

for x in sys.argv[1:]:
    try:
	jd=float(x)
    except ValueError:
	continue
    jd=jd+0.5
    Z=int(jd)
    F=jd-Z
    alpha=int((Z-1867216.25)/36524.25)
    A=Z + 1 + alpha - int(alpha/4)

    B = A + 1524
    C = int( (B-122.1)/365.25)
    D = int( 365.25*C )
    E = int( (B-D)/30.6001 )

    dd = B - D - int(30.6001*E) + F

    if E<13.5:
	mm=E-1

    if E>13.5:
	mm=E-13

    if mm>2.5:
	yyyy=C-4716

    if mm<2.5:
	yyyy=C-4715

    months=["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
    daylist=[31,28,31,30,31,30,31,31,30,31,30,31]
    daylist2=[31,29,31,30,31,30,31,31,30,31,30,31]

    h=int((dd-int(dd))*24)
    min=int((((dd-int(dd))*24)-h)*60)
    sec=86400*(dd-int(dd))-h*3600-min*60

    # Now calculate the fractional year. Do we have a leap year?
    if (yyyy%4 != 0):
	days=daylist2
    elif (yyyy%400 == 0):
	days=daylist2
    elif (yyyy%100 == 0):
	days=daylist
    else:
	days=daylist2

    if "-f" in sys.argv:
	daysum=0
	for y in range(mm-1):
	    daysum=daysum+days[y]
	daysum=daysum+dd-1

	if days[1]==29:
	    fracyear=yyyy+daysum/366
	else:
	    fracyear=yyyy+daysum/365
	print x+" = "+`fracyear`
    else:
	print x+" = "+months[mm-1]+" %i, %i, " % (dd, yyyy), 
	print string.zfill(h,2)+":"+string.zfill(min,2)+":"+string.zfill(sec,2)+" UTC"

print

