Datetime ABAP:如何向时间戳类型的日期添加天

Datetime ABAP:如何向时间戳类型的日期添加天,datetime,abap,Datetime,Abap,在ABAP编程语言中,如何在TIMESTAMP类型的时间上添加1天,并正确地进行月/年滚动 例如: data lv_time type TIMESTAMP value '20180228000000'. data(lv_new_time) = lv_time + 1. " should be '20180301000000', but instead is '20180228000001' data(lv_new_time2) = lv_time + 1000000. " should be '

在ABAP编程语言中,如何在
TIMESTAMP
类型的时间上添加1天,并正确地进行月/年滚动

例如:

data lv_time type TIMESTAMP value '20180228000000'.
data(lv_new_time) = lv_time + 1. " should be '20180301000000', but instead is '20180228000001'
data(lv_new_time2) = lv_time + 1000000. " should be '20180301000000', but instead is '20180229000000'

我不确定它是否有效,但也许值得一试

提取时间戳的日期,在日期上加上一天,然后用新的日期和剩余的时间戳创建一个新的时间戳

差不多

data: stamp type timestamp value '20180301000000000',
      stamp_date type dats,
      new_stamp type timestamp.
stamp_date = stamp(8). "if it doesn't work, just look for a FM
add 1 to stamp_date.
new_stamp = stamp_date && stamp+8.

我不确定它是否能“按原样”工作,但我很肯定你能找到一种方法让它从那里开始工作。。。我们都在等待正确的答案;)

您可以使用FM IAM_TIMESTAMP_CALC向时间戳添加一天,结果将是2018030100000:

  DATA lv_time TYPE timestamp VALUE '20180228000000'.

  CALL FUNCTION 'IAM_TIMESTAMP_CALC'
    EXPORTING
      iv_refdate = lv_time
*     IV_XBACKWARD       =
      iv_days    = '1'
*     IV_HOURS   = '0'
*     IV_MINUTES = '0'
*     IV_SECONDS = '0'
    IMPORTING
      ev_date    = lv_time.

这里有一个适合你的解决方案。系统中应该提供的功能模块是
时间戳\u持续时间\u添加

REPORT zzz.

DATA lv_time TYPE timestamp VALUE '20180228000000'.

START-OF-SELECTION.
  DATA timestamp_out TYPE timestamp.

  CALL FUNCTION 'TIMESTAMP_DURATION_ADD'
    EXPORTING
      timestamp_in    = lv_time
      timezone        = 'UTC'
      duration        = 1
      unit            = 'TAG' " day (in German)
    IMPORTING
      timestamp_out   = timestamp_out
    EXCEPTIONS
      timestamp_error = 1
      OTHERS          = 2.

  ASSERT sy-subrc = 0.

  WRITE timestamp_out.
在查看了的答案之后,我查看了
TIMESTAMP\u DURATION\u ADD
函数的引擎盖,发现了一些ABAP语法,它可以在不需要函数调用的情况下完成这项工作

constants: lc_time_zone type timezone value 'UTC'.
data lv_timestamp_before type timestamp value '20180228001234'.
data lv_timestamp_after type timestamp.
data lv_date like sy-datum.
data lv_time like sy-uzeit.

convert time stamp lv_timestamp_before time zone lc_time_zone
    into date lv_date time lv_time.
lv_date = lv_date + 1.
convert date lv_date time lv_time
    into time stamp lv_timestamp_after time zone lc_time_zone.

如果您不喜欢恢复旧的过程编程,可以使用类
CL\u ABAP\u TSTMP
,如中所述


(太糟糕了,
CL\u ABAP\u TSTMP=>SECSOFDAY
是私有的……但是,嘿,至少这让你想到了如何处理闰年……。

上面的代码将在
stamp\u date=stamp(8)
中转储,并在算术运算(键入p)期间显示消息
溢出。我知道这很奇怪,因为
DATETIME
实际上是一个字符串,人们希望字符串操作函数能够处理它。您推荐什么功能模块?你能给出一个在这个场景中使用它的例子吗?谢谢我不提供完整的工作代码,只提供提示。检查Joszef的答案,它是有效的。这甚至不是一个明智的方法。请删除此“答案”,并停止引导其他人在花园小径上寻找答案。到目前为止,投票最多的答案使用了这种不合理的方法,只是使用了正确的工作代码片段。也许你对我的回答是对的,但我是新来的,对此我不确定,请随意标记它,如果继续,让mods删除它。我不会抱怨的。如果你不介意的话,我会让人们通过提出更合适的答案来接受我的答案。转储时会显示错误消息
未找到功能模块“IAM_TIMESTAMP_CALC”
,看在皮特的份上,你正在运行哪个SAP版本?该FM自2005年开始存在(尽管未发布)。功能模块
IAM\u TIMESTAMP\u CALC
不存在于S/4HANA Infinity系统(软件组件
S4CORE
)上,也不存在于HANA Infinity系统(软件组件
SAP\u APPL
)上。因此,它肯定不是一个标准函数。在SAP中,时间戳类型只是一个浮点类型,因此得到的结果是正确的。然而,有一种方法可以干净利落地做到这一点。我记得我以前做过,但我必须浏览我的资源。我仍然认为调用函数模块是一个更好的主意。:)@贾格尔,为什么?:)就我个人而言,我喜欢使用基本的ABAP语法。它只需要3行代码,更独立于系统。一般经验法则:SAP说不要使用“未发布”的功能模块(即,有一天,SAP可以在没有警告的情况下将其删除或将其标记为过时)。CONVERT已发布并记录。而且转换速度要快得多。@SandraRossi另一方面,一般的经验法则是不应该复制代码。:)@Jagger这不是一个“重复”,因为它只有3条ABAP语句——甚至可以简化它以删除2条转换,并且只执行赋值,不需要受到一些SAP代码的启发:)
data(tstmp)=value tzntimestp(lv_timestamp)。将1添加到tstmp(8)。lv_timestamp=tstmp。
但我不太喜欢它,所以没有完美的解决方案!(主要是因为SAP不提供基于内核的日期/时间库)您能为我们的读者提供一个工作代码示例吗?:)
DATA some_timestamp TYPE timestamp VALUE '20180228000000'.
DATA(new_timestamp) = cl_abap_tstmp=>add(
    tstmp = some_timestamp
    secs  = ( 365 * 24 * 60 * 60  )
).