【问题标题】:Converting a date in COBOL在 COBOL 中转换日期
【发布时间】:2016-04-05 13:22:59
【问题描述】:

所以我将 mmddyyyy (01012000) 日期读入 pic x (8) 中,我想知道如何将以前的变量信息创建为 yyyymmdd (20000101) 格式的新变量。我确定必须有某种方法可以使用子字符串或其他方法来做到这一点?

【问题讨论】:

    标签: cobol cobol85


    【解决方案1】:

    @ScottNelson 提供了答案的“使用子字符串”部分,以下是答案的“或者什么不是”部分。

    01  mmddyyyy.
        05  mm     pic xx.
        05  dd     pic xx.
        05  yyyy   pic xxxx.
    
    01  yyyymmdd.
        05  yyyy   pic xxxx.
        05  mm     pic xx.
        05  dd     pic xx.
    
    move corresponding mmddyyyy to yyyymmdd
    

    【讨论】:

      【解决方案2】:

      在工作存储中:

      77  mmddyyyy-date pic x(8).
      77  yyyymmdd-date pic x(8).
      

      在您的程序划分逻辑中:

      move mmddyyyy-date(1:2) to yyyymmdd-date(5:2)
      move mmddyyyy-date(3:2) to yyyymmdd-date(7:2)
      move mmddyyyy-date(5:4) to yyyymmdd-date(1:4)
      

      【讨论】:

        【解决方案3】:
           01  a-name-to-describe-the-source-date.
               05  antdtsd-dd                      PIC XX.
               05  antdtsd-mm                      PIC XX.
               05  antdtsd-yyyy                    PIC XXXX.
        
           01  a-name-to-describe-the-destination-date.
               05  antdtdd-yyyy                    PIC XXXX.
               05  antdtdd-mm                      PIC XX.
               05  antdtdd-dd                      PIC XX.
        

        或者

           01  a-name-to-describe-the-source-date  PIC X(8).
           01  FILLER 
               REDEFINES a-name-to-describe-the-source-date.
               05  antdtsd-dd                      PIC XX.
               05  antdtsd-mm                      PIC XX.
               05  antdtsd-yyyy                    PIC XX.
        
           01  a-name-to-describe-the-destination-date.
           01  FILLER 
               REDEFINES a-name-to-describe-the-destination-date.
               05  antdtdd-yyyy                    PIC XX.
               05  antdtdd-mm                      PIC XX.
               05  antdtdd-dd                      PIC XX.
        

        然后

               MOVE antdtsd-dd                     TO antdtdd-dd
               MOVE antdtsd-mm                     TO antdtdd-mm
               MOVE antdtsd-yyyy                   TO antdtdd-yyyy
        

        首先,如果您将此称为“转换”,则您夸大了。这是对数据的简单重新排列。

        其次,有很多方法可以做到这一点。你用哪种方式做? COBOL 往往由“团队”编码,如果您这样做是为了一份工作,那么最好按照团队中其他人的做法来完成。

        向您展示了两种方法:引用修改和使用 CORRESPONDING(如果您在实际代码中看到它,通常会缩写为 CORR - 如果意图不输入太多,谁将输入 CORRESPONDING.. .?).

        否则如何在它们之间进行选择?表现?他们可能会生成相同的代码。所以编译器不在了。人类读者的可理解性?对我来说,这在 COBOL(或任何语言)中非常重要。

        引用修改的两个问题。错字?没问题,代码会编译执行。你会在测试中找到它。你不会吗?在某一点?并浪费所有的时间,直到你找到它。第二个是,(5:4)是什么意思?当有人告诉你“那个程序在做一些奇怪的事情”时,你必须首先发现年份被伪装成(5:4)。哦,还有(1:4)。太好了,您甚至还没有开始寻找程序的问题,您仍然需要检查位置和长度是否正确。好的,日期是一个微不足道的例子,但是参考修改用户大概将其应用于他们可以做的所有事情(如果不是,为什么将其应用于日期)?所以,祝你阅读愉快。

        哦,COBOL 没有“字符串”,它有固定长度的字段。引用修改创建字段

        CORR。使用它可以节省大量打字(它存在的原因可能是由于打孔卡,以及许多 COBOL 程序处理输入数据和创建新输出数据的方式。打孔卡上的程序,所以减少打字的真正原因 -用于打孔卡程序)。

        嗯,现在是现代。

        假设您想使用“月份”作为下标来获取月份名称(如果年份是 2005 年)。

        IF yy OF yyyymmdd EQUAL TO "2005"
            MOVE month-name-in-table ( mm OF yyyymmdd ) TO ...
        END_IF
        

        (假设 mm OF yyyymmdd 被定义为数字)。

        您想在整个程序中分散“限定”(使用 OF 或 IN 通过引用它所属的东西来使名称唯一),以便您可以使用 CORR?

        【讨论】:

        • 很好的解释,比尔。但是您的 05 级 -yyyy 字段仅是当前列表中的 PIC XX。除此之外;作为“小型编程 COBOL,只是为了向人们展示”类型的开发人员,我可能会在同一页代码中使用所有三种样式。只是为了炫耀可用的多功能性。在生产车间可能没有意义,但希望在操作示例中不会造成太大的危害。
        • @BrianTiffin 感谢现场。应该测试过:-)。当然。我只是希望它成为使用这种方式的首选,并了解其他方式(将会遇到)。
        • 同意,比尔。最清晰的总是最好的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多