format date/time presentation

1) i am trying to print the timeframe of a log file using the start/end date/time being extracted from the file itself. my problem is how to convert the following numeric date format to the one that i prefer:

Start time: 0204161129
End time : 0204171431

into:

Start time: Apr 16 2002 11:29 AM
End time : Apr 17 2002 14:31 PM

I have a script that is working, but with a horrible 40+ lines into it, and i wanted to, at least, improve it.

2) also, for the "man date" description below, how can i get all those variables, and the value they represent? is there a command # date '+....' for a variable to specify AM or PM on the date/time? i think this will be a very good info too.

thanks a lot!

DESCRIPTION
The date utility writes the date and time to standard output
or attempts to set the system date and time. By default,
the current date and time will be written.

 Specifications of native language translations of month  and
 weekday  names  are  supported.  The month and weekday names
 used for a language are based on the locale specified by the
 environment variable LC_TIME; see environ\(5\).

 The following is the default form for the "C" locale:

      %a %b %e %T %Z %Y

1) It's not very clear where the century is supposed to come from. But I'll assume that high values get a 19 while low values get a 20.

#! /usr/bin/ksh

input=0204161309

set -A months Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
echo $input | sed 's/\(..\)/\1 /g' | read yr mo dy hr mn
((yr<50)) && cn=20 || cn=19
((hr<12)) && ss=am || ss=pm
((hr=hr%12))

print  ${months[mo-1]} $dy ${cn}${yr} ${hr}:${mn} $ss

2) "man strftime" has the complete list. And
date "+%p"
will output am or pm.

i'm getting this error on line 18. also, do i have to put $ sign on $hr and $mo, considering they are variables?
what does ${months[$mo-1]} do with reference to the sed command?

thanks...

15 (($hr<12)) && ss=AM || ss=PM
16 ($hr=$hr%12))
17
18 print ${months[$mo-1]} $dy $yr ${hr}:${mn} $ss

[18]: months: subscript out of range

I cut and pasted that script in after testing it. Don't fiddle with it and it will work. It it still fails after you put it back the way it is supposed to be, put a line
echo mo = $mo
just before the print and post the entire script as you are running it and the results of the echo mo.

Thanks, i had to cut & paste the script into notepad then into my tty. It's working.

Perderabo, can you please provide explanation on the text in bold ?
I would like to have a concrete analysis of the script so i can use them
for in the future? Thanks...

#! /usr/bin/ksh

input=0204161309

set -A months Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
echo $input | sed 's/\(..\)/\1 /g' | read yr mo dy hr mn
((yr<50)) && cn=20 || cn=19
((hr<12)) && ss=am || ss=pm
((hr=hr%12))

print ${months[mo-1]} $dy ${cn}${yr} ${hr}:${mn} $ss

The sed command put a space after every two characters, this is how I split the fields up so that I could then read them into seperate variables.

Hmmm...now that I look at it, the hr thing may need some help. First hr holds the hours and if the hr is less than 12, it fine the way it is. But if hr was 13, we need it to be set to 1. And if it is 14, we want 2. This is so we can move from a 24 hour clock to a 12 hour clock. The % operator does this. It is a integer divide, but the result is the remainder, not the quotient. So 14 % 2 means we divide 14 by 12 and we want the remainder which is 2.

The problem that I now see is that if hour is zero, we may want to set it to twelve. This kinda depends on your local customs and whatnot, but this is how my watch works. We can do that with:

((hr=hr%12)) || hr=12

The || does the second command only if the first command fails. And a ((...)) that results in a zero is treated as if it failed. I just love stuff like this.

The set command established an array of 12 elements, one for each month. But the index runs from zero to 11. So I had to subtract 1 from the mo variable to get the proper index. So that expression just pulls out the proper element from the array.