Fiori日期时间处理系列-ABAP如何处理日期和时间

写在前面

处理日期和时间是每个程序员的基本技能之一,但是当你开发Fiori应用程序时,你会发现问题开始变得复杂起来。

在典型的Fiori开发场景中,我们要使用多种不同的技术组合,例如ABAP,OData服务,SAPUI5。除此之外如果你使用SAP云平台,或者使用开源的OPENUI5和其他后台语言集成,你会面临更复杂的场景。所有这些技术都有自己处理日期和时间的方式,把他们组合起来之后会不会产生问题呢?

作者

郭之嘉

介绍

郭之嘉老师将撰写一系列的针对Fiori日期时间处理的文章。

这个系列文章的目的包括:

· 基于S/4 HANA的Fiori开发的完整场景,分析各个组成部分处理日期。

· 帮助使用其他技术组合进行Fiori开发的程序员梳理一个分析此类问题的思路。

文章列表:

· ABAP如何处理日期/时间 (本文)

· 将ABAP日期/时间类型转换为OData日期/时间类型

· SAPUI5如何处理OData日期/时间

· 如何在SAPUI5中处理日期/时间的表示

· 使用日期/时间字段处理对实体的创建请求

· 具有日期/时间关键字段的处理实体

· 使用日期/时间字段作为OData查询选项

· 处理时区和时差

本文是系列文章《Fiori日期时间处理》的第一篇。在这篇文章中,我们一起来看一看ABAP如何处理日期和时间。

1

日期/时间的数据类型

ABAP具有四种日期/时间数据类型,他们分别是:

(1)日期类型

日期类型在ABAP当中的类型名称为d,在数据字典当中使用DATS表示,实际存储是一个8位的文本。例如’20180121’。

(2)时间类型

时间类型的ABAP数据类型名称为t,数据字典中为TIMS,实际存储是6位的文本。如’104355’

(3)短时间戳

短时间戳并不是一个ABAP数据类型,也不是数据字典基本类型,实际在ABAP中是8字节的类型,在ABAP数据字典中是15位长度的DEC类型。在ABAP数据字典中,默认用来做短时间戳的域是TZNTSTMPS,数据元素是TIMESTAMP。短时间戳是一个精确到秒的p类型变量,例如’20170121104355’。

(4)长时间戳

长时间戳并不是一个ABAP数据类型,也不是数据字典基本类型,实际在ABAP中是11字节,7位小数的类型,在ABAP数据字典中是21位长度7位小数的DEC类型。在ABAP数据字典中,默认用来做短时间戳的域是TZNTSTMPL,数据元素是TIMESTAMPL。长时间戳是一个精确到千万分之一秒的p类型变量,例如’20170121104355.1234567’。

2

如何取得当前的日期和时间

下面的示例代码表达了如何取得当前的日期和时间

注意事项:

当说到要取得当前时间时,我们有下面5种可能

ABAP服务器的时间

数据库服务器的时间

客户端电脑的时间

用户主数据所设定时区的时间

格林威治时间(UTC)

在ABAP服务器中,我们有一套机制把所有的ABAP服务器的时间和后台数据库服务器的时间同步,所以在可容许的误差范围内,时间(1)等于时间(2)。

客户端电脑的时间容易受到各种外部因素影响,而且客户用的操作系统也可能不同,当获取用户时间时,一般会使用用户主数据里面(SU01或SU3)所设定的时区。如果用户没有设定时区,则使用存储在TTZCU表里面的默认时区。

日期/时间变量永远是某个特定时区输出的,开发者必须关注时区问题。时间戳永远是存储格林威治时间(UTC)

ABAP的时间系统变量并不是实时刷新的,只有当程序启动,屏幕刷新等时间节点,时间字段才会刷新。所以在一段运行时间较长的ABAP代码中,如果想得到实时的时间,要使用GET TIME语句手动更新时间。

3

日期/时间变量的处理

(1)把日期/时间当作文本来处理

日期和时间变量存储成文本,当然可以使用文本的处理方法。我们一般用这种方法截取日期和时间中的不同部分。下面是一个简单的例子。

(2)把日期/时间当作数字处理

与文本不同的是他们还可以隐式转换成整数进行运算,当然这样的运算不一定都有实际意义。下表是一个对有意义的计算的总结。

注意:

本文不讨论在特定业务场景的计算,如工厂日历等。

如果需要做复杂的日期计算,或者计算两个日期时间组合之间的关系,最简单的方法是把她们都转换成时间戳再计算

(3)处理时间戳

虽然时间戳存储位小数,但是千万不要把她们当成一般的小数来处理。在处理时间戳时,应该使用系统类CL_ABAP_TSTMP来处理。

注意:网络上能够找到很多ABAP的日期和时间处理函数,在使用的时候我们要谨慎。因为这些函数并不属于SAP_BASIS模块,可能只是依附于某一个业务模块。如果你的自开发程序不是仅依赖于某个模块的,就尽量不要使用依赖于某个模块的代码,否则当程序从一个系统迁移到另一个系统的时候就可能出现问题。

(4)日期/时间相关的SQL函数

在编写OPEN SQL和Core Data Service时,还可以使用以下SQL函数来处理日期和时间。

· DATS_DAYS_BETWEEN( date1, date2 )用来计算两个日期差几天;

· DATS_ADD_DAYS( date, days , on_error )用来为一个日期添加天数;

· DATS_ADD_MONTHS( date, months, on_error )用来为一个日期添加月份;

· TSTMP_CURRENT_UTCTIMESTAMP( )取得当前时间戳;

· TSTMP_SECONDS_BETWEEN( tstmp1, tstmp2, on_error )计算两个时间戳见想差的秒数;

· TSTMP_ADD_SECONDS( tstmp, seconds, on_error )为时间戳添加秒数;

注意:

·前3个可以在OPEN SQL和CoreData Service中使用,后三个只能在Core Data Service中使用

·在使用基于SQL的技术时,尽量不要把经过计算的列用作查询条件,即使在HANA下这也会对性能产生不好的影响。我们可以使用S/4 HANA 1709中新增的Date Function,或者创建日期/时间维度来解决日期计算问题。在后续的文章中我们还会详细讨论这两种手段。

4

类型的相互转换

你可以在日期/时间和时间戳之间进行相互的类型转换。

(1)将日期/时间转换为时间戳

将日期/时间转换为时间戳时,需要注意你的日期和时间是有时区的,在转换时间戳的时候,会转换成格林威治时间,所以你必须告诉系统你当前的变量是哪个时区,这样才能计算出UTC时间。下面是一段代码示例

(2)将时间戳转换为日期/时间

由于时间戳总会以格林威治时间存储,所以在转换成日期和时间时,也必须提供时区。

下面是一段代码示例

(3)日期/时间转换的SQL函数

日期/时间转换的SQL函数目前只能在Core Data Service中使用,OPEN SQL不能使用。

·TSTMP_TO_DATS( tstmp, tzone, clnt, on_error )将时间戳的日期部分转为d类型

· TSTMP_TO_TIMS( tstmp, tzone, clnt, on_error )将时间戳的时间部分转换为t类型

· DATS_TIMS_TO_TSTMP( date, time, tzone, clnt, on_error )将日期和时间拼成时间戳

· ABAP_SYSTEM_TIMEZONE( clnt, on_error )取得系统时区

· ABAP_USER_TIMEZONE( user, clnt, on_error )取得用户主数据的时区

5

输出

数据输出不仅意味着把她们输出到屏幕,我们也可以以一定格式输出到一个文本变量中。

按照现在的情况来看,使用String Templates进行输出是最佳的方式。

如果你还不知道什么是String Templates,可以参考以下两篇博客。

https://blogs.sap.com/2013/05/17/using-new-abap-stuff-new-options-for-strings/

这篇博客介绍了String Templates的基本功能

https://blogs.sap.com/2017/03/25/string-template-in-abap-es6-angular-and-react/

这篇博客来自于子涵兄(Jerry),SAP成都研究院的高手,横向比较了ABAP和其他语言/框架的String Template的功能差异

在String Template中,有以下格式化选项和日期/时间有关系

· DATE,日期的格式化选项

· TIME,时间的格式化选项

· TIMESTAMP,时间戳的格式化选项

· TIMEZONE,配合时间戳使用,输出时按照要求的时区输出

· COUNTRY,设定国家,临时输出符合某个国家要求的样式

下面的示例程序比较全面的说明了输出格式

6

参考文档

成为一名真正的开发顾问,需要永远保持和一手资料的连接。任何文章,教材,包括本文,都只是帮助你能够更好的阅读一手资料。

请访问

https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/index.htm 参阅完整的ABAP文档。本文涉及的章节路径主要包括:

Date / Time Processing: ABAP – Keyword Documentation ABAP – Reference Processing Internal Data Date and Time Processing

Deal with date/time in SQL / Core Data Service: ABAP – Dictionary Built-In Functions in ABAP Dictionary Special Functions Date Functions and Time Functions

Format Options for Date and Time ABAP – Reference Processing Internal Data Character String and Byte String Processing Expressions and Functions for String Processing string_exp – String Expressions string_exp – String Templates String Templates – embedded_expressions Embedded Expressions – format_options

7

继续向前

尽管本文不能描述所有细节,但我相信你对ABAP的日期/时间处理有了基本的了解。在下一篇文章中,我们将会看一看当ABAP的变量转变为OData服务的属性时,在日期/时间的问题上系统帮助我们完成了哪些处理,又有哪些注意事项呢?

知识链接

技术在发展,ABAP语言本身也在不断发展。本文中就使用了一些ABAP语法的新特性,比如使用Data()进行变量的声明,还有String Template,这些都是ABAP最近几年来新增的语法功能,当然这些只是冰山一角。

除了基本语法之外,本文中提到的Core Data Service是ABAP在近些年来增加的重磅功能,在未来的ABAP开发中,Core Data Service的使用频率甚至比写ABAP代码还要多。

在此处,我特别向大家推荐以下几门课程,帮助你跟上ABAP的前进步伐。

· BC402 《Advanced ABAP》 5天

本课程是一门ABAP传统课程,在最新版本中加入了大量的ABAP新语法,帮助你在开发中三句并作两句,更加高效的完成任务。

· S4D400 《Introduction to ABAP Programming for S/4 HANA》5天

本课程是专门为S/4 HANA编写的ABAP教程,和传统的ABAP入门教程比,去掉了ALV,屏幕编程等过时的内容,专注于ABAP的基本语法,ABAP面向对象的基本知识。无论是对基于Fiori场景下未来的新ABAP顾问入门,还是对想在新时代站稳脚跟,重新梳理一下自己的ABAP知识的成熟顾问,都是不可多得的好书。

· S4D430 《Building Views in Core Data Service ABAP (CDS ABAP)》3天

本课程是唯一一本全面系统介绍Core Data Services 的教材。在介绍了CDS的基本和高级特性的基础上,还简要介绍了CDS的各种应用场景。为进一步应用CDS打造了坚实的基础。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180130G0UREL00?refer=cp_1026

扫码关注云+社区