ABAP 时间戳

SAP ABAP - 日期和时间

简述

ABAP 隐式引用了在世界大部分地区有效的公历。我们可以将输出转换为特定于国家/地区的日历。日期是相对于日历指定为精确的日、周或月的时间。时间被指定为相对于一天的精确秒或分钟。ABAP 始终以 24 小时格式保存时间。输出可以具有特定于国家/地区的格式。

日期和时间通常被解释为当前时区有效的本地日期。

ABAP 提供了两种内置类型来处理日期和时间 -

  • D 数据类型
  • T 数据类型

以下是基本格式 -

ABAP 复制代码
DATA: lv_date TYPE D, 
           lv_time TYPE T.  
      
DATA: lv_year TYPE I, 
           lv_month TYPE I,  
           lv_day TYPE I, 
           lv_ hour TYPE I,  
           lv_minute TYPE I, 
           lv_second TYPE I.

这两种类型都是固定长度字符类型,其形式分别为 YYYYMMDD 和 HHMMSS。

时间戳

除了这些内置类型之外,另外两种类型TIMESTAMPTIMESTAMPL在许多标准应用程序表中使用 UTC 格式存储时间戳。下表显示了 ABAP 中可用的基本日期和时间类型。

序号 数据类型和描述
1 DYYYYMMDD 形式的内置固定长度日期类型。例如,值 20150913 表示日期 2015 年 9 月 13 日
2 THHMMSS 形式的内置固定长度时间类型。例如,值 172305 表示时间 17:23:05
3 TIMESTAMP (类型 P -- 长度 8 无小数)该类型用于以 YYYYMMDDhhmmss 形式表示短时间戳。例如,值 20100913102305 表示日期 2010 年 9 月 13 日上午 10:23:05。
4 TIMESTAMPL (P 型 - 长度 11 位小数 7)TIMESTAMPL 表示 YYYYMMDDhhmmss,mmmuuun 形式的长时间戳。这里附加的数字"mmmuuun"代表秒的分数。

当前日期和时间

以下代码片段检索当前系统日期和时间。

ABAP 复制代码
   REPORT YR_SEP_15. 
   
   DATA: date_1 TYPE D. 
   
   date_1 = SY-DATUM.  
   
   Write: / 'Present Date is:', date_1 DD/MM/YYYY. 
   
   date_1 = date_1 + 06. 
   Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.

上面的代码产生以下输出:

vbnet 复制代码
  Present Date is: 21.09.2015 
  Date after 6 Days is: 27.09.2015

变量 date_1 被赋予当前系统日期 SY-DATUM 的值。接下来,我们将日期值增加 6。就 ABAP 中的日期计算而言,这意味着我们将日期对象的日期部分增加 6 天。ABAP 运行时环境非常智能,可以在日期值到达月底时滚动该日期值。

时间计算的工作方式与日期计算类似。以下代码使用基本时间算术将当前系统时间增加 75 秒。

vbnet 复制代码
```

REPORT YR_SEP_15. 
DATA: time_1 TYPE T. 
      time_1 = SY-UZEIT. 
      
Write /(60) time_1 USING EDIT MASK 
'Now the Time is: __:__:__'. 

time_1 = time_1 + 75. 
Write /(60) time_1 USING EDIT MASK 
'A Minute and a Quarter from Now, it is: __:__:__'.
```

上面的代码产生以下输出 -

csharp 复制代码
```
Now the Time is 11:45:05 
A Minute and a Quarter from Now, it is: 11:46:20
```

使用时间戳

您可以检索当前系统时间并将其存储在时间戳变量中使用GET TIME STAMP如下面的代码所示。GET TIME STAMP 语句根据所使用的时间戳数据对象的类型以长记或简写格式存储时间戳。时间戳值使用 UTC 标准进行编码。

vbnet 复制代码
REPORT YR_SEP_12. 

DATA: stamp_1 TYPE TIMESTAMP,
           stamp_2 TYPE TIMESTAMPL. 

GET TIME STAMP FIELD stamp_1. 
Write: / 'The short time stamp is:', stamp_1  TIME ZONE SY-ZONLO. 

GET TIME STAMP FIELD stamp_2. 

Write: / 'The long time stamp is:', stamp_2  TIME ZONE SY-ZONLO.

上面的代码产生以下输出 -

csharp 复制代码
The short time stamp is: 18.09.2015 11:19:40 
The long time stamp is: 18.09.2015 11:19:40,9370000

在上面的示例中,我们使用 WRITE 语句的 TIME ZONE 添加来显示时间戳。此添加根据指定时区的规则格式化时间戳的输出。系统字段 SY-ZONLO 用于显示用户首选项中配置的本地时区。

通用外部格式转内部时间格式

我们在接受外部系统的日期格式通常是 2025-08-27,或者是2025.08.27,或者是 2025/08/27 这类的格式,需要将这类日期转换为 20250827,下面写了通用的 FM,可以实现外部日期格式的识别,并转换为内部格式的日期格式。

外部时间格式一般都带冒号 :,因此也要转换为不带格式的时间,代码如下:

ABAP 复制代码
FUNCTION z_date_convert_input.  
*"----------------------------------------------------------------------  
*"*"Local Interface:  
*"  IMPORTING  
*"     REFERENCE(IV_DATUM) TYPE  STRING OPTIONAL  
*"     REFERENCE(IV_UZEIT) TYPE  STRING OPTIONAL  
*"  EXPORTING  
*"     REFERENCE(EV_DATUM) TYPE  SY-DATUM  
*"     REFERENCE(EV_UZEIT) TYPE  SY-UZEIT  
*"----------------------------------------------------------------------  
  DATA: lv_str2 TYPE char1.  
  DATA: lv_str1 TYPE string,  
        lv_str3 TYPE string,  
        lv_str4 TYPE string,  
        lv_len  TYPE i.  
  DATA: lt_str  LIKE TABLE OF lv_str1.  
  
  IF iv_datum IS NOT INITIAL.  
    IF '/.-\' CA iv_datum.  
      lv_str2 = iv_datum+4(1).  
      SPLIT iv_datum AT lv_str2 INTO TABLE lt_str.  
      LOOP AT lt_str INTO lv_str1.  
        lv_len = strlen( lv_str1 ).  
        IF lv_len EQ 1.  
          CONCATENATE lv_str3 '0' lv_str1 INTO lv_str3.  
        ELSE.  
          CONCATENATE lv_str3 lv_str1 INTO lv_str3.  
        ENDIF.  
        CLEAR: lv_str1.  
      ENDLOOP.  
      ev_datum = lv_str3.  
    ELSE.  
      ev_datum = iv_datum.  
    ENDIF.  
  ENDIF.  
  
  IF '::' CA iv_uzeit.  
    CLEAR: lt_str[].  
    lv_str2 = iv_uzeit+2(1).  
    IF '::' CA lv_str2.  
      SPLIT iv_uzeit AT lv_str2 INTO TABLE lt_str.  
    ELSE.  
      lv_str2 = iv_uzeit+1(1).  
      SPLIT iv_uzeit AT lv_str2 INTO TABLE lt_str.  
    ENDIF.  
  
    LOOP AT lt_str INTO lv_str1.  
      lv_len = strlen( lv_str1 ).  
      IF lv_len EQ 1.  
        CONCATENATE lv_str4 '0' lv_str1 INTO lv_str4.  
      ELSE.  
        CONCATENATE lv_str4 lv_str1 INTO lv_str4.  
      ENDIF.  
      CLEAR: lv_str1.  
    ENDLOOP.  
    ev_uzeit = lv_str4.  
  ELSE.  
    ev_uzeit = iv_uzeit.  
  ENDIF.  
  
ENDFUNCTION.

测试图如下:

相关推荐
苏三说技术1 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎2 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode2 小时前
Redis 在生产项目的使用
前端·后端
用户559822481222 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode2 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战2 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha2 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn2 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425912 小时前
ShardingJDBC
后端
行者全栈架构师2 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端