cobol中关于日期的计算
刚接触cobol时间不长,手头上也没什么资料,所以很多东西不是很清楚,想问下各位大大关于cobol 中日期的计算!
比如:有一个原有日期和天数,计算出新日期。要考虑到闰年和大小月的情况,另外天数可以是负数!
谢谢各位大大了。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
刚接触cobol时间不长,手头上也没什么资料,所以很多东西不是很清楚,想问下各位大大关于cobol 中日期的计算!
比如:有一个原有日期和天数,计算出新日期。要考虑到闰年和大小月的情况,另外天数可以是负数!
谢谢各位大大了。。。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
本帖最后由 jxylh111018 于 2010-03-31 10:23 编辑
下面 CL 程序直接应用就可以
仔细看看 参数部分
0001.00 /*===================================================================*/
0002.00 /* PROGRAM NAME : DATE PROCESS */
0005.00 /* &ARM : 1 ~ 5(&DAYS) ==> PRE-POST DAY (-)PRE (+)POST */
0006.00 /* 6 ~ 13(&FMDATE) ==> INPUT DATE */
0007.00 /* 14 ~ 21(&TODATE) ==> OUTPUT DATE */
0008.00 /* IF &FMDATE = 0 THEN CURRENT DATE */
0009.00 /* IF &FMDATE ERR THEN '00000000' */
0010.00 /* IF &DAYS = 0 THEN &FMDATE */
0011.00 /*===================================================================*/
0012.00 PGM PARM(&ARM)
0013.00 DCL VAR(&ARM) TYPE(*CHAR) LEN(21)
0014.00 DCL VAR(&DAYS) TYPE(*DEC) LEN(5 0)
0015.00 DCL VAR(&FMDATE) TYPE(*DEC) LEN(8 0)
0016.00 DCL VAR(&TODATE) TYPE(*DEC) LEN(8 0)
0017.00 DCL VAR(&YYMMDD) TYPE(*CHAR) LEN(6)
0018.00 DCL VAR(&YYYYMMDD) TYPE(*CHAR) LEN(
0019.00 DCL VAR(&JULIANA) TYPE(*CHAR) LEN(5)
0020.00 DCL VAR(&YYYY) TYPE(*DEC) LEN(4 0)
0021.00 DCL VAR(&AYYYY) TYPE(*CHAR) LEN(4)
0022.00 DCL VAR(&DAYSD) TYPE(*DEC) LEN(3 0)
0023.00 DCL VAR(&LEAP) TYPE(*DEC) LEN(4 0)
0024.00 DCL VAR(&DAYSINYEAR) TYPE(*DEC) LEN(3 0)
0025.00 DCL VAR(&NUM5) TYPE(*DEC) LEN(5)
0026.00 DCL VAR(&NUM7) TYPE(*DEC) LEN(7)
0027.00 DCL VAR(&LASTDAY) TYPE(*CHAR) LEN(24) +
0028.00 VALUE('312831303130313130313031')
0029.00 DCL VAR(&MONTH) TYPE(*DEC) LEN(2)
0030.00 /* DATE ERROR PROCESS */
0031.00 MONMSG MSGID(CPF0555 CPF0557) EXEC(GOTO CMDLBL(ERROR))
0032.00
0033.00 CHGVAR VAR(&DAYS) VALUE(%SST(&ARM 1 5))
0034.00 CHGVAR VAR(&FMDATE) VALUE(%SST(&ARM 6 )
0035.00 CHGVAR VAR(&TODATE) VALUE(%SST(&ARM 14 )
0036.00 /* &FMDATE=0 ==> CURRENT DATE */
0037.00 IF COND(&FMDATE *EQ 0) THEN(DO)
0038.00 /* RTVJOBA DATE(&YYMMDD) */
0039.00 /* RTVSYSVAL SYSVAL(QDATE) RTNVAR(&YYMMDD) */
0040.00 CALL PGM(GEZ011B) PARM(&YYMMDD)
0041.00 CVTDAT DATE(&YYMMDD) +
0042.00 TOVAR(&YYYYMMDD) FROMFMT(*YMD) +
0043.00 TOFMT(*YYMD) TOSEP(*NONE)
0044.00 ENDDO
0045.00 /* &FMDATE=YYYYMM00,&DAYS=9999==> COMPUTE LAST DAY OF EVERY MONTH */
0046.00 IF COND(%SST(&ARM 12 2) *NE '00' *OR &DAYS *NE +
0047.00 9999) THEN(GOTO CMDLBL(NEXT))
0048.00 IF COND(%SST(&ARM 10 2) *LT '00' *OR +
0049.00 %SST(&ARM 10 2) *GT '12') THEN(GOTO +
0050.00 CMDLBL(ERROR))
0051.00 CHGVAR VAR(%SST(&ARM 14 ) VALUE(&FMDATE)
0052.00 CHGVAR VAR(&MONTH) VALUE(%SST(&PARM 10 2))
0053.00 CHGVAR VAR(&MONTH) VALUE((&MONTH * 2) -1)
0054.00 CHGVAR VAR(%SST(&PARM 20 2)) VALUE(%SST(&LASTDAY +
0055.00 &MONTH 2))
0056.00 IF COND(%SST(&PARM 10 2) *NE '02') THEN(RETURN)
0057.00 CHGVAR VAR(&YYYY) VALUE(%SST(&PARM 6 4))
0058.00 /* YEAR / 4(REMAIN) <> 0 ==> COMMON YEAR */
0059.00 CHGVAR VAR(&NUM7) VALUE(&YYYY / 4)
0060.00 CHGVAR VAR(&LEAP) VALUE(&YYYY - (&NUM7 * 4))
0061.00 IF COND(&LEAP *NE 0) THEN(DO)
0062.00 CHGVAR VAR(%SST(&PARM 20 2)) VALUE('28')
0063.00 RETURN
0064.00 ENDDO
0065.00 /* YEAR / 100(REMAIN) <> 0 ==> LEAP YEAR */
0066.00 CHGVAR VAR(&NUM7) VALUE(&YYYY / 100)
0067.00 CHGVAR VAR(&LEAP) VALUE(&YYYY - (&NUM7 * 100))
0068.00 IF COND(&LEAP *NE 0) THEN(DO)
0069.00 CHGVAR VAR(%SST(&PARM 20 2)) VALUE('29')
0070.00 RETURN
0071.00 ENDDO
0072.00 /* YEAR / 400(REMAIN) = 0 ==> LEAP YEAR */
0073.00 CHGVAR VAR(&NUM7) VALUE(&YYYY / 400)
0074.00 CHGVAR VAR(&LEAP) VALUE(&YYYY - (&NUM7 * 400))
0075.00 IF COND(&LEAP *EQ 0) THEN( +
0076.00 CHGVAR VAR(%SST(&PARM 20 2)) VALUE('29'))
0077.00 ELSE CHGVAR VAR(%SST(&PARM 20 2)) VALUE('28')
0078.00 RETURN
0079.00
0080.00 /* CONVERT FROM DATE TO YYYYMMDD */
0081.00 NEXT: IF COND(&FMDATE *NE 0) THEN(DO)
0082.00 CHGVAR VAR(&YYYYMMDD) VALUE(&FMDATE)
0083.00 IF COND(%SST(&YYYYMMDD 1 2) *EQ '00') THEN(DO)
0084.00 CHGVAR VAR(&YYMMDD) VALUE(%SST(&YYYYMMDD 3 6))
0085.00 CVTDAT DATE(&YYMMDD) +
0086.00 TOVAR(&YYYYMMDD) FROMFMT(*YMD) +
0087.00 TOFMT(*YYMD) TOSEP(*NONE)
0088.00 ENDDO
0089.00 ENDDO
0090.00
0091.00 /* CONVERT FROM DATE TO JULIAN DATE */
0092.00 CVTDAT DATE(%SST(&YYYYMMDD 3 6)) TOVAR(&JULIANA) +
0093.00 FROMFMT(*YMD) TOFMT(*JUL) TOSEP(*NONE)
0094.00
0095.00 /* MOVE &FMDATE TO &TODATE & RETURN(IF &DAYS = 0) */
0096.00 IF COND(&DAYS = 0) THEN(DO)
0097.00 CHGVAR VAR(%SST(&PARM 14 ) VALUE(&YYYYMMDD)
0098.00 RETURN
0099.00 ENDDO
0100.00
0101.00 /* SEPARATE JULIAN DATE TO YEAR/DAYS & ADD &DAYS TO JULIAN DAYS */
0102.00 CHGVAR VAR(&YYYY) VALUE(%SST(&YYYYMMDD 1 4))
0103.00 CHGVAR VAR(&DAYSD) VALUE(%SST(&JULIANA 3 3))
0104.00 CHGVAR VAR(&NUM5) VALUE(&DAYSD + &DAYS)
0105.00
0106.00 /* COMPUTE LAST YEAR (IF &DAYS <= 0) */
0107.00 CHKPLUS: IF (&NUM5 *LE 0) CHGVAR VAR(&YYYY) VALUE(&YYYY - 1)
0108.00
0109.00 /* COMPUTE DAYS OF YEAR(&YYYY) */
0110.00 CHKLEAP: CHGVAR VAR(&NUM7) VALUE(&YYYY / 4)
0111.00 CHGVAR VAR(&LEAP) VALUE(&YYYY - (&NUM7 * 4))
0112.00 IF (&LEAP *GT 0) +
0113.00 CHGVAR VAR(&DAYSINYEAR) VALUE(365)
0114.00 ELSE CHGVAR VAR(&DAYSINYEAR) VALUE(366)
0115.00
0116.00 /* ADD &DAYSINYEAR TO &DAYS(IF &DAYS <= 0) */
0117.00 IF COND(&NUM5 *LE 0) THEN(DO)
0118.00 CHGVAR VAR(&NUM5) VALUE(&NUM5 + &DAYSINYEAR)
0119.00 GOTO CHKPLUS
0120.00 ENDDO
0121.00
0122.00 /* ADD 1 TO &YYYY (IF &DAYS > &DAYSINYEAR) */
0123.00 IF COND(&NUM5 *GT &DAYSINYEAR) THEN(DO)
0124.00 CHGVAR VAR(&YYYY) VALUE(&YYYY + 1)
0125.00 CHGVAR VAR(&NUM5) VALUE(&NUM5 - &DAYSINYEAR)
0126.00 GOTO CHKLEAP
0127.00 ENDDO
0128.00
0129.00 /* CONVERT JULIAN DATE TO YYYYMMDD(MOVE TO &TODATE) */
0130.00 CHGVAR VAR(&JULIANA) VALUE(&NUM5)
0131.00 CHGVAR VAR(&AYYYY) VALUE(&YYYY)
0132.00 CHGVAR VAR(%SST(&JULIANA 1 2)) VALUE(%SST(&AYYYY 3 2))
0133.00 CVTDAT DATE(&JULIANA) TOVAR(&YYYYMMDD) +
0134.00 FROMFMT(*JUL) TOFMT(*YYMD) TOSEP(*NONE)
0135.00 CHGVAR VAR(%SST(&PARM 14 ) VALUE(&YYYYMMDD)
0136.00 RETURN
0137.00
0138.00 /* MOVE ZERO TO &TODATE (IF DATE ERROR OCCUR) */
0139.00 ERROR: CHGVAR VAR(%SST(&PARM 14 ) VALUE('00000000')
0140.00 ENDPGM