121 lines
4 KiB
COBOL
121 lines
4 KiB
COBOL
identification division.
|
|
program-id. date-manipulation.
|
|
|
|
environment division.
|
|
configuration section.
|
|
repository.
|
|
function all intrinsic.
|
|
|
|
data division.
|
|
working-storage section.
|
|
01 given-date.
|
|
05 filler value z"March 7 2009 7:30pm EST".
|
|
01 date-spec.
|
|
05 filler value z"%B %d %Y %I:%M%p %Z".
|
|
|
|
01 time-struct.
|
|
05 tm-sec usage binary-long.
|
|
05 tm-min usage binary-long.
|
|
05 tm-hour usage binary-long.
|
|
05 tm-mday usage binary-long.
|
|
05 tm-mon usage binary-long.
|
|
05 tm-year usage binary-long.
|
|
05 tm-wday usage binary-long.
|
|
05 tm-yday usage binary-long.
|
|
05 tm-isdst usage binary-long.
|
|
05 tm-gmtoff usage binary-c-long.
|
|
05 tm-zone usage pointer.
|
|
01 scan-index usage pointer.
|
|
|
|
01 time-t usage binary-c-long.
|
|
01 time-tm usage pointer.
|
|
|
|
01 reform-buffer pic x(64).
|
|
01 reform-length usage binary-long.
|
|
|
|
01 current-locale usage pointer.
|
|
|
|
01 iso-spec constant as "YYYY-MM-DDThh:mm:ss+hh:mm".
|
|
01 iso-date constant as "2009-03-07T19:30:00-05:00".
|
|
01 date-integer pic 9(9).
|
|
01 time-integer pic 9(9).
|
|
|
|
procedure division.
|
|
|
|
call "strptime" using
|
|
by reference given-date
|
|
by reference date-spec
|
|
by reference time-struct
|
|
returning scan-index
|
|
on exception
|
|
display "error calling strptime" upon syserr
|
|
end-call
|
|
display "Given: " given-date
|
|
|
|
if scan-index not equal null then
|
|
*> add 12 hours, and reform as local
|
|
call "mktime" using time-struct returning time-t
|
|
add 43200 to time-t
|
|
perform form-datetime
|
|
|
|
*> reformat as Pacific time
|
|
set environment "TZ" to "PST8PDT"
|
|
call "tzset" returning omitted
|
|
perform form-datetime
|
|
|
|
*> reformat as Greenwich mean
|
|
set environment "TZ" to "GMT"
|
|
call "tzset" returning omitted
|
|
perform form-datetime
|
|
|
|
|
|
*> reformat for Tokyo time, as seen in Hong Kong
|
|
set environment "TZ" to "Japan"
|
|
call "tzset" returning omitted
|
|
call "setlocale" using by value 6 by content z"en_HK.utf8"
|
|
returning current-locale
|
|
on exception
|
|
display "error with setlocale" upon syserr
|
|
end-call
|
|
move z"%c" to date-spec
|
|
perform form-datetime
|
|
else
|
|
display "date parse error" upon syserr
|
|
end-if
|
|
|
|
*> A more standard COBOL approach, based on ISO8601
|
|
display "Given: " iso-date
|
|
move integer-of-formatted-date(iso-spec, iso-date)
|
|
to date-integer
|
|
|
|
move seconds-from-formatted-time(iso-spec, iso-date)
|
|
to time-integer
|
|
|
|
add 43200 to time-integer
|
|
if time-integer greater than 86400 then
|
|
subtract 86400 from time-integer
|
|
add 1 to date-integer
|
|
end-if
|
|
display " " substitute(formatted-datetime(iso-spec
|
|
date-integer, time-integer, -300), "T", "/")
|
|
|
|
goback.
|
|
|
|
form-datetime.
|
|
call "localtime" using time-t returning time-tm
|
|
call "strftime" using
|
|
by reference reform-buffer
|
|
by value length(reform-buffer)
|
|
by reference date-spec
|
|
by value time-tm
|
|
returning reform-length
|
|
on exception
|
|
display "error calling strftime" upon syserr
|
|
end-call
|
|
if reform-length > 0 and <= length(reform-buffer) then
|
|
display " " reform-buffer(1 : reform-length)
|
|
else
|
|
display "date format error" upon syserr
|
|
end-if
|
|
.
|
|
end program date-manipulation.
|