【问题标题】:formatting DATE-TIME IN COBOL在 COBOL 中格式化日期时间
【发布时间】:2017-12-29 00:29:38
【问题描述】:

我想格式化 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  

请帮忙。在此先感谢

【问题讨论】:

  • 那你试过什么??? - 提示设置接收Function current-date的当前日期和单独的接收字段

标签: function datetime cobol


【解决方案1】:

正如 Joe 已经说过的那样 - 如果您将某些内容移动到组项中,则无需转换即可获得数据,因此要么移动子字段,要么(如果您的编译器支持它 - 您错过了指定您使用的那个) 使用FUNCTION FORMATTED-DATETIME

【讨论】:

    【解决方案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
    

    【讨论】:

    • WS-DIFF-GMT PIC S9(4) 描述了一个 4 位置字段。虽然 PIC +9(4) 会更好,但“符号”位置可能包含“0”。
    【解决方案3】:

    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】:

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

      【讨论】:

        【解决方案5】:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-06
          • 2011-11-12
          • 2011-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多