cobol中关于日期的计算

发布于 2022-08-24 05:25:11 字数 229 浏览 28 评论 1

刚接触cobol时间不长,手头上也没什么资料,所以很多东西不是很清楚,想问下各位大大关于cobol 中日期的计算!
比如:有一个原有日期和天数,计算出新日期。要考虑到闰年和大小月的情况,另外天数可以是负数!
谢谢各位大大了。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

洒一地阳光 2022-08-30 16:33:57

本帖最后由 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文