在 COBOL 中格式化日期时间

formatting DATE-TIME IN 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  

请帮忙。提前致谢

您需要在 WS-CURRENT-DATE-DATA 下定义子字段以拆分 yy、mm、dd、hh、mn、ss、ms,然后将它们分别移动到 WS-CURRENT-DATE 和WS-CURRENT-TIME 以正确显示“-”和“:”字符。

正如 Joe 已经说过的那样 - 如果您将某些内容移动到组项目中,您会在不进行转换的情况下获取数据,因此要么移动子字段,要么(如果您的编译器支持它 - 您错过了指定您的子字段)已经用过)使用 FUNCTION FORMATTED-DATETIME.

CURRENT-DATE 是一个 21 个字符的字段,包含日期、时间和与 GMT 的偏移量。 "hyphen at the back" 实际上是与 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

你在最后看到这个连字符的原因是因为这是 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 个位置。一个用于保存函数中的 return,一个用于保存格式化值,所以像这样:

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

SaggingRufus 的回答内容丰富。我尝试使用参考修改生成预期的输出。

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