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.

测试图如下:

相关推荐
David爱编程7 分钟前
volatile 关键字详解:轻量级同步工具的边界与误区
java·后端
回家路上绕了弯3 小时前
ClickHouse 深度解析:从核心特性到实战应用,解锁 OLAP 领域新势能
数据库·后端
xiaok3 小时前
本地用VScode的Live Server监听5500访问页面,ubuntu上不需要在配置5500
后端
m0_480502644 小时前
Rust 登堂 之 函数式编程(三)
开发语言·后端·rust
艾醒4 小时前
大模型面试题剖析:大模型微调与训练硬件成本计算
人工智能·后端·算法
自由生长20244 小时前
每日知识-设计模式-状态机模式
后端
用户298698530144 小时前
如何使用 Spire.Doc 在 C# 中创建、写入和读取 Word 文档?
后端
林太白4 小时前
项目中的层级模块到底如何做接口
前端·后端·node.js
一枚小小程序员哈4 小时前
基于Android的车位预售预租APP/基于Android的车位租赁系统APP/基于Android的车位管理系统APP
android·spring boot·后端·struts·spring·java-ee·maven