在 COBOL 中格式化日期时间
formatting DATE-TIME IN COBOL
我想格式化 FUNCTION DATE-TIME。我有的是
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA
DISPLAY WS-CURRENT-DATE-DATA
我尝试使用填充物
01 WS-CURRENT-DATE-DATA.
05 WS-CURRENT-DATE.
10 WS-CURRENT-YEAR PIC 9(04).
10 FILLER PIC X(01) VALUE "-".
10 WS-CURRENT-MONTH PIC 9(02).
10 WS-CURRENT-DAY PIC 9(02).
05 WS-CURRENT-TIME.
10 WS-CURRENT-HOURS PIC 9(02).
10 WS-CURRENT-MINUTE PIC 9(02).
10 WS-CURRENT-SECOND PIC 9(02).
10 WS-CURRENT-MILLISECONDS PIC 9(02).
我得到的是后面有连字符的结果,例如
2017122818242863-
但我想要的可能是这个
2017-12-28-18:24:28:63
请帮忙。提前致谢
您需要在 WS-CURRENT-DATE-DATA 下定义子字段以拆分 yy、mm、dd、hh、mn、ss、ms,然后将它们分别移动到 WS-CURRENT-DATE 和WS-CURRENT-TIME 以正确显示“-”和“:”字符。
正如 Joe 已经说过的那样 - 如果您将某些内容移动到组项目中,您会在不进行转换的情况下获取数据,因此要么移动子字段,要么(如果您的编译器支持它 - 您错过了指定您的子字段)已经用过)使用 FUNCTION FORMATTED-DATETIME
.
CURRENT-DATE 是一个 21 个字符的字段,包含日期、时间和与 GMT 的偏移量。 "hyphen at the back" 实际上是与 GMT 偏移量的第一个位置。
UNSTRING 语句可用于移动 CURRENT-DATE 的各个部分。
UNSTRING FUNCTION CURRENT-DATE
INTO WS-CURRENT-YEAR WS-CURRENT-MONTH WS-CURRENT-DAY
WS-CURRENT-HOURS WS-CURRENT-MINUTE
WS-CURRENT-SECOND WS-CURRENT-MILLISECONDS
END-UNSTRING
DISPLAY WS-CURRENT-DATE-DATA
你在最后看到这个连字符的原因是因为这是 FUNCTION CURRENT-DATE
期望的实际数据定义:
05 WS-CURRENT-DATE-TIME.
10 WS-CURRENT-DATE.
15 WS-CURRENT-YEAR PIC 9(4).
15 WS-CURRENT-MONTH PIC 9(2).
15 WS-CURRENT-DAY PIC 9(2).
10 WS-CURRENT-TIME.
15 WS-CURRENT-HOUR PIC 9(2).
15 WS-CURRENT-MIN PIC 9(2).
15 WS-CURRENT-SEC PIC 9(2).
15 WS-CURRENT-MS PIC 9(2).
10 WS-DIFF-GMT PIC S9(4).
您会注意到我在末尾多了一个格林威治标准时差字段。此外,您不能只在定义中添加填充符并期望该函数知道如何处理它。基本上发生的事情是您输入的连字符(在图片子句中)被从函数传递的数据覆盖,您需要的是工作存储中的 2 个位置。一个用于保存函数中的 return,一个用于保存格式化值,所以像这样:
01 WS-TEMP-DT.
05 WS-TEMP-DATE-TIME.
10 WS-TEMP-DATE.
15 WS-TEMP-YEAR PIC 9(4).
15 WS-TEMP-MONTH PIC 9(2).
15 WS-TEMP-DAY PIC 9(2).
10 WS-TEMP-TIME.
15 WS-TEMP-HOUR PIC 9(2).
15 WS-TEMP-MIN PIC 9(2).
15 WS-TEMP-SEC PIC 9(2).
15 WS-TEMP-MS PIC 9(2).
10 WS-DIFF-GMT PIC S9(4).
01 WS-FORMATTED-DT.
05 WS-FORMATTED-DATE-TIME.
15 WS-FORMATTED-YEAR PIC 9(4).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-MONTH PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-DAY PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-HOUR PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MIN PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-SEC PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MS PIC 9(2).
MOVE FUNCTION CURRENT-DATE TO WS-TEMP-DATE-TIME
MOVE WS-TEMP-YEAR TO WS-FORMATTED-YEAR
MOVE WS-TEMP-MONTH TO WS-FORMATTED-MONTH
MOVE WS-TEMP-DAY TO WS-FORMATTED-DAY
MOVE WS-TEMP-HOUR TO WS-FORMATTED-HOUR
MOVE WS-TEMP-MIN TO WS-FORMATTED-MIN
MOVE WS-TEMP-SEC TO WS-FORMATTED-SEC
MOVE WS-TEMP-MS TO WS-FORMATTED-MS
DISPLAY WS-FORMATTED-DATE-TIME
SaggingRufus 的回答内容丰富。我尝试使用参考修改生成预期的输出。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATETIME PIC X(21).
01 WS-FORMATTED-DT.
05 WS-FORMATTED-DTE-TME.
15 WS-FORMATTED-YEAR PIC 9(4).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-MONTH PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-DY PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-HOUR PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MINS PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-SEC PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MS PIC 9(2).
PROCEDURE DIVISION.
MOVE FUNCTION CURRENT-DATE TO WS-DATETIME.
MOVE WS-DATETIME(1:4) TO WS-FORMATTED-YEAR.
MOVE WS-DATETIME(5:2) TO WS-FORMATTED-MONTH.
MOVE WS-DATETIME(7:2) TO WS-FORMATTED-DY.
MOVE WS-DATETIME(9:2) TO WS-FORMATTED-HOUR.
MOVE WS-DATETIME(11:2) TO WS-FORMATTED-MINS.
MOVE WS-DATETIME(13:2) TO WS-FORMATTED-SEC.
MOVE WS-DATETIME(15:2) TO WS-FORMATTED-MS.
DISPLAY WS-DATETIME.
DISPLAY WS-FORMATTED-DT.
STOP RUN.
结果:
2018011005202041+0000
2018-01-10-05:20:20:41
我想格式化 FUNCTION DATE-TIME。我有的是
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA
DISPLAY WS-CURRENT-DATE-DATA
我尝试使用填充物
01 WS-CURRENT-DATE-DATA.
05 WS-CURRENT-DATE.
10 WS-CURRENT-YEAR PIC 9(04).
10 FILLER PIC X(01) VALUE "-".
10 WS-CURRENT-MONTH PIC 9(02).
10 WS-CURRENT-DAY PIC 9(02).
05 WS-CURRENT-TIME.
10 WS-CURRENT-HOURS PIC 9(02).
10 WS-CURRENT-MINUTE PIC 9(02).
10 WS-CURRENT-SECOND PIC 9(02).
10 WS-CURRENT-MILLISECONDS PIC 9(02).
我得到的是后面有连字符的结果,例如
2017122818242863-
但我想要的可能是这个
2017-12-28-18:24:28:63
请帮忙。提前致谢
您需要在 WS-CURRENT-DATE-DATA 下定义子字段以拆分 yy、mm、dd、hh、mn、ss、ms,然后将它们分别移动到 WS-CURRENT-DATE 和WS-CURRENT-TIME 以正确显示“-”和“:”字符。
正如 Joe 已经说过的那样 - 如果您将某些内容移动到组项目中,您会在不进行转换的情况下获取数据,因此要么移动子字段,要么(如果您的编译器支持它 - 您错过了指定您的子字段)已经用过)使用 FUNCTION FORMATTED-DATETIME
.
CURRENT-DATE 是一个 21 个字符的字段,包含日期、时间和与 GMT 的偏移量。 "hyphen at the back" 实际上是与 GMT 偏移量的第一个位置。
UNSTRING 语句可用于移动 CURRENT-DATE 的各个部分。
UNSTRING FUNCTION CURRENT-DATE
INTO WS-CURRENT-YEAR WS-CURRENT-MONTH WS-CURRENT-DAY
WS-CURRENT-HOURS WS-CURRENT-MINUTE
WS-CURRENT-SECOND WS-CURRENT-MILLISECONDS
END-UNSTRING
DISPLAY WS-CURRENT-DATE-DATA
你在最后看到这个连字符的原因是因为这是 FUNCTION CURRENT-DATE
期望的实际数据定义:
05 WS-CURRENT-DATE-TIME.
10 WS-CURRENT-DATE.
15 WS-CURRENT-YEAR PIC 9(4).
15 WS-CURRENT-MONTH PIC 9(2).
15 WS-CURRENT-DAY PIC 9(2).
10 WS-CURRENT-TIME.
15 WS-CURRENT-HOUR PIC 9(2).
15 WS-CURRENT-MIN PIC 9(2).
15 WS-CURRENT-SEC PIC 9(2).
15 WS-CURRENT-MS PIC 9(2).
10 WS-DIFF-GMT PIC S9(4).
您会注意到我在末尾多了一个格林威治标准时差字段。此外,您不能只在定义中添加填充符并期望该函数知道如何处理它。基本上发生的事情是您输入的连字符(在图片子句中)被从函数传递的数据覆盖,您需要的是工作存储中的 2 个位置。一个用于保存函数中的 return,一个用于保存格式化值,所以像这样:
01 WS-TEMP-DT.
05 WS-TEMP-DATE-TIME.
10 WS-TEMP-DATE.
15 WS-TEMP-YEAR PIC 9(4).
15 WS-TEMP-MONTH PIC 9(2).
15 WS-TEMP-DAY PIC 9(2).
10 WS-TEMP-TIME.
15 WS-TEMP-HOUR PIC 9(2).
15 WS-TEMP-MIN PIC 9(2).
15 WS-TEMP-SEC PIC 9(2).
15 WS-TEMP-MS PIC 9(2).
10 WS-DIFF-GMT PIC S9(4).
01 WS-FORMATTED-DT.
05 WS-FORMATTED-DATE-TIME.
15 WS-FORMATTED-YEAR PIC 9(4).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-MONTH PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-DAY PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-HOUR PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MIN PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-SEC PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MS PIC 9(2).
MOVE FUNCTION CURRENT-DATE TO WS-TEMP-DATE-TIME
MOVE WS-TEMP-YEAR TO WS-FORMATTED-YEAR
MOVE WS-TEMP-MONTH TO WS-FORMATTED-MONTH
MOVE WS-TEMP-DAY TO WS-FORMATTED-DAY
MOVE WS-TEMP-HOUR TO WS-FORMATTED-HOUR
MOVE WS-TEMP-MIN TO WS-FORMATTED-MIN
MOVE WS-TEMP-SEC TO WS-FORMATTED-SEC
MOVE WS-TEMP-MS TO WS-FORMATTED-MS
DISPLAY WS-FORMATTED-DATE-TIME
SaggingRufus 的回答内容丰富。我尝试使用参考修改生成预期的输出。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATETIME PIC X(21).
01 WS-FORMATTED-DT.
05 WS-FORMATTED-DTE-TME.
15 WS-FORMATTED-YEAR PIC 9(4).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-MONTH PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-DY PIC 9(2).
15 FILLER PIC X VALUE '-'.
15 WS-FORMATTED-HOUR PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MINS PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-SEC PIC 9(2).
15 FILLER PIC X VALUE ':'.
15 WS-FORMATTED-MS PIC 9(2).
PROCEDURE DIVISION.
MOVE FUNCTION CURRENT-DATE TO WS-DATETIME.
MOVE WS-DATETIME(1:4) TO WS-FORMATTED-YEAR.
MOVE WS-DATETIME(5:2) TO WS-FORMATTED-MONTH.
MOVE WS-DATETIME(7:2) TO WS-FORMATTED-DY.
MOVE WS-DATETIME(9:2) TO WS-FORMATTED-HOUR.
MOVE WS-DATETIME(11:2) TO WS-FORMATTED-MINS.
MOVE WS-DATETIME(13:2) TO WS-FORMATTED-SEC.
MOVE WS-DATETIME(15:2) TO WS-FORMATTED-MS.
DISPLAY WS-DATETIME.
DISPLAY WS-FORMATTED-DT.
STOP RUN.
结果:
2018011005202041+0000
2018-01-10-05:20:20:41