在COBOL中格式化日期时间

时间:2017-12-29 00:29:39

标签: function datetime cobol

我想格式化FUNCTION DATE-TIME。我拥有的是

MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA
DISPLAY WS-CURRENT-DATE-DATA

我尝试使用填充物

01 WS-CURRENT-DATE-DATA.                               
05 WS-CURRENT-DATE.                                 
   10  WS-CURRENT-YEAR         PIC 9(04).           
   10  FILLER                  PIC X(01)  VALUE "-".
   10  WS-CURRENT-MONTH        PIC 9(02).           
   10  WS-CURRENT-DAY          PIC 9(02).           
05 WS-CURRENT-TIME.                                 
   10  WS-CURRENT-HOURS        PIC 9(02).           
   10  WS-CURRENT-MINUTE       PIC 9(02).           
   10  WS-CURRENT-SECOND       PIC 9(02).           
   10  WS-CURRENT-MILLISECONDS PIC 9(02).

我得到的结果是后面的连字符,如

2017122818242863- 

但我想要的可能是这个

2017-12-28-18:24:28:63  

请帮助。提前致谢

5 个答案:

答案 0 :(得分:2)

您之后看到此连字符的原因是因为这是实际数据定义FUNCTION CURRENT-DATE所期望的:

05 WS-CURRENT-DATE-TIME.            
   10 WS-CURRENT-DATE.              
      15 WS-CURRENT-YEAR  PIC  9(4).
      15 WS-CURRENT-MONTH PIC  9(2).
      15 WS-CURRENT-DAY   PIC  9(2).
   10 WS-CURRENT-TIME.              
      15 WS-CURRENT-HOUR  PIC  9(2).
      15 WS-CURRENT-MIN   PIC  9(2).
      15 WS-CURRENT-SEC   PIC  9(2).
      15 WS-CURRENT-MS    PIC  9(2).
   10 WS-DIFF-GMT         PIC S9(4).

你会注意到格林威治标准时差的末尾有一个额外的字段。此外,您不能只是在定义中添加填充符,并希望该函数知道如何处理它。基本上正在发生的事情是你输入的连字符(在图片子句中)被从函数传递的数据覆盖,你需要的是工作存储器中的2个位置。一个用于保存函数的返回值,另一个用于保存格式化的值,如下所示:

01 WS-TEMP-DT.   
   05 WS-TEMP-DATE-TIME.            
      10 WS-TEMP-DATE.              
         15 WS-TEMP-YEAR  PIC  9(4). 
         15 WS-TEMP-MONTH PIC  9(2).
         15 WS-TEMP-DAY   PIC  9(2).
      10 WS-TEMP-TIME.              
         15 WS-TEMP-HOUR  PIC  9(2).
         15 WS-TEMP-MIN   PIC  9(2).
         15 WS-TEMP-SEC   PIC  9(2).
         15 WS-TEMP-MS    PIC  9(2).
      10 WS-DIFF-GMT         PIC S9(4).

01 WS-FORMATTED-DT.   
   05 WS-FORMATTED-DATE-TIME.                       
      15 WS-FORMATTED-YEAR  PIC  9(4). 
      15 FILLER             PIC X VALUE '-'.
      15 WS-FORMATTED-MONTH PIC  9(2).
      15 FILLER             PIC X VALUE '-'.
      15 WS-FORMATTED-DAY   PIC  9(2).  
      15 FILLER             PIC X VALUE '-'.           
      15 WS-FORMATTED-HOUR  PIC  9(2).
      15 FILLER             PIC X VALUE ':'.
      15 WS-FORMATTED-MIN   PIC  9(2).
      15 FILLER             PIC X VALUE ':'.
      15 WS-FORMATTED-SEC   PIC  9(2).
      15 FILLER             PIC X VALUE ':'.
      15 WS-FORMATTED-MS    PIC  9(2).

MOVE FUNCTION CURRENT-DATE TO WS-TEMP-DATE-TIME
MOVE WS-TEMP-YEAR  TO WS-FORMATTED-YEAR
MOVE WS-TEMP-MONTH TO WS-FORMATTED-MONTH
MOVE WS-TEMP-DAY   TO WS-FORMATTED-DAY
MOVE WS-TEMP-HOUR  TO WS-FORMATTED-HOUR
MOVE WS-TEMP-MIN   TO WS-FORMATTED-MIN
MOVE WS-TEMP-SEC   TO WS-FORMATTED-SEC
MOVE WS-TEMP-MS    TO WS-FORMATTED-MS

DISPLAY WS-FORMATTED-DATE-TIME

答案 1 :(得分:1)

您需要在WS-CURRENT-DATE-DATA下定义子字段以分解yy,mm,dd,hh,mn,ss,ms,然后将它们分别移动到WS-CURRENT-DATE和WS-下的字段中当前正确地让你的' - '和':'字符显示出来。

答案 2 :(得分:1)

正如Joe已经说过的 - 如果你将某些内容移动到一个组项目中,你可以在没有转换的情况下获取数据,所以要么移动子字段,要么(如果你的编译器支持它) - 你错过了指定哪一个&# 39;已使用)使用FUNCTION FORMATTED-DATETIME

答案 3 :(得分:1)

CURRENT-DATE是一个21个字符的字段,包含与GMT相关的日期,时间和偏移量。后面的连字符"连字符实际上是GMT偏移的第一个位置。

UNSTRING语句可用于移动CURRENT-DATE的各个部分。

       UNSTRING FUNCTION CURRENT-DATE
       INTO WS-CURRENT-YEAR WS-CURRENT-MONTH WS-CURRENT-DAY
           WS-CURRENT-HOURS WS-CURRENT-MINUTE
           WS-CURRENT-SECOND WS-CURRENT-MILLISECONDS
       END-UNSTRING
       DISPLAY WS-CURRENT-DATE-DATA

答案 4 :(得分:0)

SaggingRufus的答案提供了丰富的信息。我试图使用Reference Modification生成预期的输出。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATETIME              PIC X(21).
01 WS-FORMATTED-DT.
   05 WS-FORMATTED-DTE-TME.
      15 WS-FORMATTED-YEAR  PIC  9(4). 
      15 FILLER             PIC X VALUE '-'.
      15 WS-FORMATTED-MONTH PIC  9(2).
      15 FILLER             PIC X VALUE '-'.
      15 WS-FORMATTED-DY    PIC  9(2).
      15 FILLER             PIC X VALUE '-'.
      15 WS-FORMATTED-HOUR  PIC  9(2).
      15 FILLER             PIC X VALUE ':'.
      15 WS-FORMATTED-MINS  PIC  9(2).
      15 FILLER             PIC X VALUE ':'.
      15 WS-FORMATTED-SEC   PIC  9(2).
      15 FILLER             PIC X VALUE ':'.
      15 WS-FORMATTED-MS    PIC  9(2).
PROCEDURE DIVISION.
MOVE FUNCTION CURRENT-DATE TO WS-DATETIME. 
MOVE WS-DATETIME(1:4)  TO WS-FORMATTED-YEAR.
MOVE WS-DATETIME(5:2)  TO WS-FORMATTED-MONTH.
MOVE WS-DATETIME(7:2)  TO WS-FORMATTED-DY.
MOVE WS-DATETIME(9:2)  TO WS-FORMATTED-HOUR.
MOVE WS-DATETIME(11:2) TO WS-FORMATTED-MINS.
MOVE WS-DATETIME(13:2) TO WS-FORMATTED-SEC.
MOVE WS-DATETIME(15:2) TO WS-FORMATTED-MS.
DISPLAY WS-DATETIME.
DISPLAY WS-FORMATTED-DT.
STOP RUN.

结果:

2018011005202041+0000
2018-01-10-05:20:20:41