我要求将任何日期(DD.MM.YYYY)转换为月份的最后日期(例如:如果日期是1999年1月20日那么它应该转换为1999年1月31日)?
答案 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-DAY
,TEST-MONTH
和TEST-YEAR
。
使用EVALUATE
测试月份(TEST-MONTH
)。如果月份是30天,那么MOVE
30到TEST-DAY
。做同样的事情
31个月。由于闰年,二月是一个特例。一旦你确定这个月是2月,
测试TEST-YEAR
到determine if it is a leap year
MOVE
28或29 TO TEST-DAY
,具体取决于测试结果。
现在TEST-DATE
将包含您要查找的日期。 MOVE
它可以在任何需要的地方使用。
答案 1 :(得分:1)
您可以使用函数integer-of-date,它返回与任何日期对应的整数值。假设您的输入日期是ddmmyyyy格式,并且您希望hte输出采用相同的格式。让我们说日期是20011999,你想要31011999.你可以按照以下步骤。
请注意,您必须再添加一张支票以便处理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
。并20040220
至20040303
,然后20040229
。 20051220
至20060101
,然后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的回答密切相关。