【问题标题】:Difference between 2 timestamps2个时间戳之间的差异
【发布时间】:2012-05-10 17:19:59
【问题描述】:

我在 ABAP 中有一个程序,他们在变量中使用“timestamp”类型,因此他们可以获得某些事件的时间。他们使用它是因为他们需要毫秒。

我现在的任务是获取其中两个变量之间的差异,但我似乎找不到功能模块或其他解决方案。

非常感谢任何帮助!

【问题讨论】:

  • 减去它?什么问题? :-)
  • 好吧,我不确定直接减法是否可行。这是否会根据月份和类似情况考虑不同的日子?

标签: abap


【解决方案1】:

使用方法CL_ABAP_TSTMP=>SUBTRACT,通过传递两个必须是TIMESTAMPL类型的时间戳,以便包含毫秒,并且两个时间戳之间的差异将以秒数返回,包括毫秒。

例子:

DATA: lv_tstmp1 TYPE timestampl,
      lv_tstmp2 TYPE timestampl,
      lv_diff   TYPE tzntstmpl.

lv_tstmp1 = '20190704000010.999'. " July 4th, 00:00:10 and 999 ms
lv_tstmp2 = '20190703235950.001'. " July 3rd, 23:59:50 and 001 ms

CALL METHOD cl_abap_tstmp=>subtract
    EXPORTING
      tstmp1 = lv_tstmp1
      tstmp2 = lv_tstmp2
    RECEIVING
      r_secs = lv_diff.

ASSERT lv_diff = '20.998'. " expectation verified or run time error

【讨论】:

    【解决方案2】:

    Google 搜索显示此建议:http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/840ad679-0601-0010-cd8e-9989fd650822#q-8:使用类 CL_ABAP_TSTMP。您还可以在此线程中查看如何使用该类的示例:http://scn.sap.com/thread/85476

     cl_abap_tstmp=>systemtstmp_syst2utc(
        exporting
          syst_date = <wa_joblist>-strtdate
          syst_time = <wa_joblist>-strttime
        importing
          utc_tstmp = start_stamp ).
    
      cl_abap_tstmp=>systemtstmp_syst2utc(
        exporting
          syst_date = sy-datum
          syst_time = sy-uzeit
        importing
          utc_tstmp = now_stamp ).
    
      seconds = cl_abap_tstmp=>subtract(
          tstmp1 = now_stamp
          tstmp2 = start_stamp ).
    

    【讨论】:

    • 这实际上并没有回答问题,它需要以毫秒为单位的增量..
    • 方法SUBTRACT 可以接受以毫秒为单位的时间戳,这将回答这个问题,但该示例首先使用总是返回时间戳没有毫秒的方法,因此它破坏了答案...
    【解决方案3】:

    使用调频 *'CCU_TIMESTAMP_DIFFERENCE'*

    在检查哪个时间戳更大后调用 FM。

    IF TIMESTAMP_2 > TIMESTAMP_1.
    
     CALL FUNCTION 'CCU_TIMESTAMP_DIFFERENCE'
       EXPORTING
          TIMESTAMP1 = TIMESTAMP_2
          TIMESTAMP2 = TIMESTAMP_1 
       IMPORTING 
          DIFFERENCE = TIMESTAMP_DIFFERENCE.
    EndIf.
    

    【讨论】:

      【解决方案4】:

      现有提案忽略毫秒。这是现代 ABAP AS 的解决方案,它也考虑了毫秒:

      r_secs = CONV #( cl_abap_tstmp=>subtract(
        tstmp1 = CONV timestamp( i_ts1 )
        tstmp2 = CONV timestamp( i_ts1 )
      ) ).
      r_secs = r_secs + ( frac( i_ts1 ) - frac( i_ts2 ) ).
      

      i_ts1 和 i_ts2 是两个时间戳,r_secs (type f) 是结果。

      这是一个小测试器:

      REPORT ztest_timestampl_dif.
      
      CLASS lcl_timestampl DEFINITION.
        PUBLIC SECTION.
          CLASS-METHODS:
            test,
            dif
              IMPORTING
                        i_ts1         TYPE timestampl
                        i_ts2         TYPE timestampl
              RETURNING VALUE(r_secs) TYPE f.
      ENDCLASS.
      
      START-OF-SELECTION.
        lcl_timestampl=>test( ).
      
      CLASS lcl_timestampl IMPLEMENTATION.
        METHOD test.
          DATA:
            l_ts1   TYPE timestampl,
            l_ts2   TYPE timestampl,
            l_msecs TYPE f.
      
          GET TIME STAMP FIELD l_ts1.
          WAIT UP TO '0.378' SECONDS.
          GET TIME STAMP FIELD l_ts2.
      
          l_msecs = dif( i_ts1 = l_ts1  i_ts2 = l_ts2 ).
      
          cl_demo_output=>display( l_msecs ).
        ENDMETHOD.
      
        METHOD dif.
          r_secs = CONV #( cl_abap_tstmp=>subtract(
            tstmp1 = CONV timestamp( i_ts1 )
            tstmp2 = CONV timestamp( i_ts1 )
          ) ).
          r_secs = r_secs + ( frac( i_ts1 ) - frac( i_ts2 ) ).
        ENDMETHOD.
      
      ENDCLASS.
      

      如果您正在使用它,请考虑添加溢出处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 1970-01-01
        • 2014-05-04
        相关资源
        最近更新 更多