USAGE
jdc { -j | -d | -D } options [ format-options ] date-record
or
proc | JDC { -j | -d | -D } -i options [ format-options ]


PURPOSE: Convert Julian date to Kalendar or vice versa. Replace / inject / generate date records

The date record may be a bare date or a string containing a date.
If given on the command line, the string that is processed is concatenated with one blankspace between
each part.

CHANGES w.r.t. JDC are in summary:
No RJD nor full JD.
No Time Zone option. 
More logic in the options.
More clarity in output record construction.

Still missing: UTC leap-seconds (really? What would we expect in a date conversion?)

OPTIONS:
Compulsory:

 -j[i][D][{y|h|s|f}]] ...  
               - Convert Julian date x to kalendar form.

                 In the -ji case, x is read as an integer.
       D or  d - Output date as year and day-of-year.

             y - Output date as a floating-point year, format f15.8
             h - Output date, ending with a floating-point hour, format f12.6
             f - Output date down to the fractional second
             s - Output date and time of day as a fractional second (format f10.3) 

 -d[y|D][i][{h|s}][{c|C}yyyy,mm,dd[,hh[,mi[,se[,fff]]]]]   ...   yyyy mm dd [hh [mi [se [fff]]]]
 -d
[y|D]M[s] ...   yyyy mm dd [hh [mi [se [fff]]]]
               - Convert kalendar form to Julian date
             y - input date is a floating-point year.
       D or  d - input date as year and day-of-year: yyyy doy
                
Tolerable delimiters besides ` are `- `, `. `_ and `:
                
(doy concerns the target date, not the reference date.
                
If you want to give the reference date as year,doy ,
                
specify yyyy,0,doy  )
             i - output as an integer.
     [M]h [M]s - without M, scale output with 24 or 86400, respectively.
                 With M, output integer Julian day and floating point
                 hour [default] or, with s, second, respectively.

   date string - output relative to ( = "subtract" ) this date.
             c - cut at this date.
             C - cut at this date and subtract this date.

 -D[D[d]|d[ifmt]][{y|h}ffmt]  yyyy mm dd [hh [mi [se [fff]]]]
               - Output orthodox date (rectified for out-of-range values)
           -Dd - output date as year and day-of-year.
           -DD -  input date as year and day-of-year.
          -DDd - input and output
as year and day-of-year.
 
          -Dy - output floating-point year
           -Dh - output yyyy mm dd and floating-point hour
       -DHffmt -  input yyyy mm dd and floating-point hour

       -DSffmt -  input yyyy mm dd and floating-point second

         
ifmt - the format code pertaining to year month day output
                 In the case of day-of-year output, the month must be overwritten:

                    jdc -DDdi4,
i2,t5,i4 -k3 2014 367 12 10 1

          ffmt - the format code pertaining to the floating-point variable.

                 For changing the complete output format, use -f:

Optional:

 -DB           - Debug printing. Don't expect too much.

 -C[{y|h}fmt]  - Conversion from date to floating-point year (like -Dy) or
                 yyyy mm dd h.hhh
(like -Dh)

 -b#r1[,#r2]   - date part of input string is contained in columns r1..r2
                 Default: 1..end. 

 -i[#c1,#c2,#c3,#c4]
               - read from stdin (file mode). Default: command line
.

 -I[#c1,#c2,#c3,#c4]
               - take input from command line, long string with more than the

                 bare time information.

                 The time field is extracted from an input line and processed.
                 The input line is copied to the output with columns c1..c2 before
                 and c3..c4 after the translated date record.
                 To chop n characters from the end of the string specify c4 = -n-1
                 Delimiter is none by default. Use -m to change.

 -m            - Suppress the default ASC=0 delimiter (important if output to pipe).
                 (We need a different default, why the heck the ASC 0 !?)

         Changed 2015-04-05 If there's trouble (if char(0) is needed somewhere, we
         must change back or add a char(0)-option, like -m@  

 -m            - delimeter is one blankspace
 -m:d
[]]       - delimiter string d, max length 16, to inject after date and time
                 For trailing blanks, enter string d with a trailing `].
 -mb#n         - blank delimiter, length n

  -m0           - no delimiter, length 0

 -td[]]        - trailing delimiter string d, max length 16, to inject
                 after date and time.
                 For trailing blanks, enter string d with a trailing `]
 -tb
#n         - blank delimiter, length n

 -kk           - Input and output: depth of hh mm ss fff part. k=0..4

 -n[{i|u}]p... - output month in character form, default: lower-case.
.............i - capitalize initial (Jan Feb etc.)
             u - convert to upper-case.
             p - the position of the month number in the input string

 -N[{i|u}]p,q  - input month in character form, like -n . The month name
                 occupies input string positions p:q 

 -A[h|m|s]j -S[h|m|s]j
               - Add, or subtract
j days to/from date.
.............h - value j is in hours.
.............m - value j is in minutes.
.............s - value j is in seconds.

 -{A|S}ryyyy,mm,dd[,hh[,mm[,ss[,fff]]]]
               - ... output date is relative to this date.
                 Delimiters `- and `: are tolerated.

  -L#m,#n       - Loop from m to n with time increment specified under -A or -S
                 Example:
                  JDC -D -k3 -Am1 -L0,3 2012 01 06
                 2012 01 06 00 00 00
                 2012 01 06 00 01 00
                 2012 01 06 00 02 00
                 2012 01 06 00 03 00

 -F:fmt        - Input format (avoid outer parentheses), default is
                    [t1,i4,2(1x,i2),1x,2(i2,1x ),i2,1x,i3] 

 -f:fmt        - Output .. , default is
                    (t1, i4, 1h ,i2.2, 1h ,i2.2:, a ,2(i2.2,:,1h ),i2.2,:,1h ,i3.3 )
                 Note the `a --------------------^ !
                 There is a delimiter written out at this position. You will need
                 to code this `a while the delimiter might be blank or NUL, escaping your notice.
                 (I need to review this; it's ugly, sorry. Also the -m option is a nuisance.)


 -FF           - Reading date with free format (*)

 -FT -FS       - Input format "tight" or "short", i.e. no delimiters between the
                 parts, "short" meaning 2-digit year

 -T#c          - Input date-and-time string starts at position c.

 -ft  -fs      - Output format "tight" or "short", i.e. no delimiters between the
                 parts, "short" meaning 2-digit year
                 Cannot be combined with -- or -, or -:  If you need a delimiter
                 between YMD and HMS, ...

 -ftd -fsd     - Use d (single char) as the delimiter between YMD and HMS.
                 Example:  jdc -ft, -k3 -DD 2014:162
                 20140611,000000

 -fi:fmt       - Format for Julian integer input/output. Default i5.5 .
 
-Fi:fmt         synonymous

 -MDY -DMY     - ordering of Year Month Day in input. Output is always YMD

 -YY[{i[o][#y]|o}]
               - 2-digit year on input, output or both (-YYio).
            #y - Switch 1900/2000 at year y (two digits). Default=50

 -P#n          - prepend output string with n blanks.
 -pstring      - prepend output string with string

 -,            - write comma-separated output.
 --            - write dash-separated output.
 -:            - write
Y-M-D h:m:s output.
 
-::           - write Y-M-D:h:m:s output.
 
-:::          - write Y:M:D:h:m:s output.
                 Default: blank-separated output.

 -B[r]         - Allow leading blanks in output. Replace each leading blank with r

Not implemented yet:
 -s[h]         - kalendar form is yyyy mm dd s with floating-point seconds (hours)


Format redefinitions must occur last of all options. Use these options
if the automatically generated/modified formats are inappropriate.

 -F:fmt        - input format.
 -f:fmt        - output format.

Rectifying out-of-range:
We cannot (yet) accept negative values for year, month nor day
and negative values less than -9 for hour, minute, second.
See example 1.

NOTE:
If the date part on the command line is empty, the program will try input from <stdin>

EXAMPLES:
(1) Rectifying out-of-range

jdc -D -k3 2003 01 01 -2 59 20
2002 12 31 22 59 20

jdc -D 2003 01 00
2002 12 31

jdc -D 2003 01 99
2003 04 09

jdc -D 2003 99 99
2011 06 07

jdc -DD 2003 366
2004 01 01


(2)
Date format conversion:

Add a blank between tightly written date and the hour:
jdc -k1 -m -FT -f:i4,2i2.2,a,i2.2 -D 2012120105
20121201 05

adding 132 hours to the date:
jdc -k1 -m -FT -f:i4,2i2.2,a,i2.2 -Ah132 -D 2012120105
20121206 17

(3)
GWR file names. Produce a sequence of file names

jdc -D -FS -fs -A1 -L0,15 -m -b12,17 -I1,11,18,21 RAW_o054/A1090701.054
RAW_o054/A1090701.054
RAW_o054/A1090702.054
RAW_o054/A1090703.054
RAW_o054/A1090704.054
RAW_o054/A1090705.054
RAW_o054/A1090706.054
RAW_o054/A1090707.054
RAW_o054/A1090708.054
RAW_o054/A1090709.054
RAW_o054/A1090710.054
RAW_o054/A1090711.054
RAW_o054/A1090712.054
RAW_o054/A1090713.054
RAW_o054/A1090714.054
RAW_o054/A1090715.054
RAW_o054/A1090716.054
12345678901234567890123456789012345678901234567890123456789012345678901234567890
         1         2         3         4         5         6         7         8

We have a helper script for the -b and -I options: /home/hgs/bin/jdch
jdc -D -L0,10 -A1 -FS -fs -m -b24,29 -I1,23,30,35 /home/hgs/TD/d/G1_garb_130109-1s.mc

jdc -D -L0,10 -A1 -FS -fs -m `jdch '/home/hgs/TD/d/G1_garb_{130109}-1s.mc'`

set mfile='/home/hgs/TD/d/G1_garb_{130109}-1s.mc'
jdc -D -L0,10 -A1 -FS -fs -m `jdch "$mfile"`

/home/hgs/TD/d/G1_garb_130109-1s.mc

/home/hgs/TD/d/G1_garb_130110-1s.mc
/home/hgs/TD/d/G1_garb_130111-1s.mc
/home/hgs/TD/d/G1_garb_130112-1s.mc
/home/hgs/TD/d/G1_garb_130113-1s.mc
/home/hgs/TD/d/G1_garb_130114-1s.mc
/home/hgs/TD/d/G1_garb_130115-1s.mc
/home/hgs/TD/d/G1_garb_130116-1s.mc
/home/hgs/TD/d/G1_garb_130117-1s.mc
/home/hgs/TD/d/G1_garb_130118-1s.mc
/home/hgs/TD/d/G1_garb_130119-1s.mc
12345678901234567890123456789012345678901234567890123456789012345678901234567890
         1         2         3         4         5         6         7         8

jdc -L1,1665,24 -m -D -A1 -fs -f:'2h??,3i2.2,4h.054' 2009 06 10
??090611.054
??090612.054
??090613.054
??090614.054
??090615.054
??090616.054
??090617.054
??090618.054
??090619.054
??090620.054
...

(4)
Guralp file names. Produce a whole sequence of 65 file names.
Input is a y-m-d kalendar date

jdc -L0,65 -Am10 -:: -k3 -T5 -I1,4,24,36 -m -Dd GCF.2011-06-15 01:10:00.3U93Z2.ts
GCF.2011:166:01:10:00.3U93Z2.ts
GCF.2011:166:01:20:00.3U93Z2.ts
GCF.2011:166:01:30:00.3U93Z2.ts
GCF.2011:166:01:40:00.3U93Z2.ts
...

-L0,65       - the loop from 0 to 65
-Am10        - add 10 minutes every pass
-::          - colons after YYYY and DOY
-k3          - HH MM SS in input and output
-T5          - input string, date starts at column 5
-I1,4,24,36  - copy columns 1-4 as the leading output
               and 24-36 as the trailing output
-m           - avoid ASCII(0) as a delimiter
-Dd          - from kalendar date to YYY DOY.

(5)
Convert calendar dates in a time series file to MJD

2003 01 01 00 data...................
2003 01 01 01 data...................
cat file | jdc -i1,0,14,-1 -d -k1 -mb -f:f10.3
gives
52640.000  data...................
52640.042  data...................

(6)
Write calendar data for labelling an axis in GMT

jdc -d -A1 -k1 -L0,10 2013 08 01 12 | jdc -mb -i1,13,14,15 -j | awk '{print $1,"0.5 12 0 1 2",$4}'
56505.500000 0.5 12 0 1 2 01
56506.500000 0.5 12 0 1 2 02
56507.500000 0.5 12 0 1 2 03
56508.500000 0.5 12 0 1 2 04
56509.500000 0.5 12 0 1 2 05
56510.500000 0.5 12 0 1 2 06
56511.500000 0.5 12 0 1 2 07
56512.500000 0.5 12 0 1 2 08
56513.500000 0.5 12 0 1 2 09
56514.500000 0.5 12 0 1 2 10
56515.500000 0.5 12 0 1 2 11



We have more examples  (for the old JDC program however. Must be rewritten)

.bye