function cds2jd, dt, errmsg=errmsg

;
;  form output format
;
jd = {int:0L,frac:0.0d0}
if n_elements(dt) gt 1 then jd = replicate(jd, n_elements(dt))
message=''

on_error, 2   ;  Return to the caller of this procedure if error occurs.

;
; See if any parameters were passed
;
if n_params() eq 0 then begin
    message = 'Syntax:  JD = CDS(DATE-TIME)'
    goto, handle_error
endif

;
;  convert input to internal format
;
utc = anytim2utc(dt,errmsg=errmsg)
if n_elements(errmsg) ne 0 then $
    if errmsg(0) ne '' then return, jd   ;  ERRMSG set in called procedure

if utc(0).mjd eq 0 then begin
    message='Error in determination of Modified Julian Date.'
    goto, handle_error
endif

;
; to CDS external format
;
eutc = int2utc(utc,errmsg=errmsg)
if n_elements(errmsg) ne 0 then $
    if errmsg(0) ne '' then return, jd   ;  ERRMSG set in called procedure

;
;  get integer Julian day for day which starts at noon
;  (note that JULDAY is an IDL library function, no ERRMSG keyword can be set)
;
for i=0,n_elements(dt)-1 do begin
    jd(i).int = julday(eutc(i).month,eutc(i).day,eutc(i).year)
;
;  was time requested before noon?
;
    if eutc(i).hour lt 12 then begin
        jd(i).int = jd(i).int - 1
        eutc(i).hour = eutc(i).hour + 12
    endif else begin
        eutc(i).hour = eutc(i).hour - 12
    endelse
;
;  form fraction of day
;
    jd(i).frac = eutc(i).hour/24.0d0 + eutc(i).minute/1440.0d0 + $
          (eutc(i).second + eutc(i).millisecond/1000.0d0)/86400.0d0
endfor
;
;  deliver
;
if n_elements(errmsg) ne 0 then errmsg = message
return, jd

;
; Error handling point.
;
handle_error:
if n_elements(errmsg) eq 0 then message, message
errmsg = message
return, jd
;
end