任何日期都应该转换为cobol的月末日期?

时间:2011-07-12 13:17:18

标签: cobol

我要求将任何日期(DD.MM.YYYY)转换为月份的最后日期(例如:如果日期是1999年1月20日那么它应该转换为1999年1月31日)?

4 个答案:

答案 0 :(得分:4)

你究竟遇到了什么麻烦? COBOL还是算法?我猜它的COBOL。

我不会直接给你答案,因为你是 显然倾向于语言,并且在制定具体细节方面是有价值的 为了你自己。

以下是一些提示:

WORKING-STORAGE中定义日期字段,以便您可以选择日,月和年作为单独的项目。类似的东西:

01 TEST-DATE.
   05 TEST-DAY     PIC 99.
   05              PIC X.
   05 TEST-MONTH   PIC 99.
   05              PIC X.
   05 TEST-YEAR    PIC 9999.

请注意未命名的PIC X字段。这些包含日/月/年分隔符。它们不需要被赋予数据名称,因为 你不需要引用它们。有时会给出这种类型的数据项 名称FILLER,但名称是可选的。

阅读EVALUATE声明。这是link IBM Enterprise COBOL手册。 EVALUATE的所有描述在所有版本的COBOL中都应该类似。

MOVE感兴趣的日期TO TEST-DATE。现在,您可以将年,月和日作为单个项目引用:TEST-DAYTEST-MONTHTEST-YEAR

使用EVALUATE测试月份(TEST-MONTH)。如果月份是30天,那么MOVE 30到TEST-DAY。做同样的事情 31个月。由于闰年,二月是一个特例。一旦你确定这个月是2月, 测试TEST-YEARdetermine if it is a leap year MOVE 28或29 TO TEST-DAY,具体取决于测试结果。

现在TEST-DATE将包含您要查找的日期。 MOVE它可以在任何需要的地方使用。

答案 1 :(得分:1)

您可以使用函数integer-of-date,它返回与任何日期对应的整数值。假设您的输入日期是ddmmyyyy格式,并且您希望hte输出采用相同的格式。让我们说日期是20011999,你想要31011999.你可以按照以下步骤。

  • 将输入日期的月份增加1。 (20 * 02 * 1999)
  • 将日期设为01并使用函数整数日期(* 01 * 021999)
  • 从返回的整数中减去1。
  • 使用函数date-of-integer,它将为您提供所需的结果。

请注意,您必须再添加一张支票以便处理12月份。

答案 2 :(得分:0)

程序"计算月结束日期"闰年或12月不需要任何检查。

   identification division.
   program-id. last-day.
   data division.
   working-storage section.
   1 test-date.
    88 test-1 value "20.01.1999".
    88 test-2 value "20.02.2004".
    88 test-3 value "20.12.2005".
     2 dd pic 99.
     2 pic x.
     2 mm pic 99.
     2 pic x.
     2 yyyy pic 9999.

   1 month-end-date binary pic 9(8) value 0.

   procedure division.
   begin.
       set test-1 to true
       perform run-test
       set test-2 to true
       perform run-test
       set test-3 to true
       perform run-test
       stop run
       .

   run-test.
       display test-date " to " with no advancing
       perform test-date-to-iso
       perform compute-month-end-date
       perform iso-to-test-date
       display test-date
       .

   compute-month-end-date.

       *> get date in following month
       compute month-end-date = function
           integer-of-date (month-end-date) + 32
           - function mod (month-end-date 100)
       compute month-end-date = function
           date-of-integer (month-end-date)

       *> get last day of target month
       compute month-end-date = function
           integer-of-date (month-end-date)
           - function mod (month-end-date 100)
       compute month-end-date = function
           date-of-integer (month-end-date)
       .

   test-date-to-iso.
       compute month-end-date = yyyy * 10000
           + mm * 100 + dd
       .

   iso-to-test-date.
       move month-end-date to dd
       .
   end program last-day.

结果:

20.01.1999 to 31.01.1999
20.02.2004 to 29.02.2004
20.12.2005 to 31.12.2005

虽然这对新手COBOL程序员来说可能有点令人生畏,但有一个简单的解释。程序"计算月结束日期"由两个相同的部分组成,除了" + 32"。

将第二部分放在第一位,它从日期的整数中减去月中的某一天,给出“第零”的整数值。这个月的某一天。这正是上个月最后一天的整数值。以下计算给出了' yyyymmdd'中的日期。格式。

第一部分做同样的事情,除了它增加32以获得下个月的日期,第1到第4,取决于原始月份的天数。

首先将19990120更改为19990201,然后更改为19990131。并2004022020040303,然后200402292005122020060101,然后20051231

答案 3 :(得分:0)

你走了!运行代码here

IDENTIFICATION DIVISION.                               
PROGRAM-ID. STACK2.                                    
DATA DIVISION.                                         
WORKING-STORAGE SECTION.                               
01 WS-DATE        PIC X(10).                           
01 WORK-DATE.                                          
   05 WORK-DAY    PIC 9(2).                            
   05             PIC X.                               
   05 WORK-MONTH  PIC 9(2).                            
   05             PIC X.                               
   05 WORK-YEAR   PIC 9(4).                            
01 MONTH-31 PIC 9(2).                                  
   88 IS-MONTH-31 VALUES 01, 03, 05, 07, 08, 10, 12.   
   88 IS-MONTH-30 VALUES 04, 06, 09, 11.               
01 WS-C           PIC 9(4) VALUE 0.                    
01 WS-D           PIC 9(4) VALUE 0.                    
PROCEDURE DIVISION.                                    
    ACCEPT WS-DATE.                                    
    MOVE WS-DATE TO WORK-DATE.                         
    DISPLAY 'ACTUALE TEST-DATE: ' WORK-DATE.             
    MOVE WORK-MONTH TO MONTH-31.                       
    EVALUATE TRUE                                      
    WHEN IS-MONTH-31                                   
    MOVE 31 TO WORK-DAY                                             
    WHEN IS-MONTH-30                                    
    MOVE 30 TO WORK-DAY                                              
    WHEN OTHER                                          
    DIVIDE WORK-YEAR BY 4 GIVING WS-C REMAINDER WS-D    
    IF WS-D NOT EQUAL 0                                 
    MOVE 28 TO WORK-DAY                                 
    ELSE                                                
    MOVE 29 TO WORK-DAY                                 
    END-IF                                              
    END-EVALUATE.  
    DISPLAY 'MODIFIED TEST-DATE: ' WORK-DATE                                     
    STOP RUN.                                           

这个解决方案与@ NealB的回答密切相关。