在IBM i RPG中将数值型日期转换为MM/DD/YYYY格式的实现问题
解决方案
方法1:调整现有数据结构实现转换
你当前定义的Datefield结构字段顺序不符合数值日期的存储逻辑(数值日期为YYYYMMDD8位结构,前4位为年、中间2位为月、最后2位为日),先调整结构定义:
Dcl-ds Datefield; // 调整后对应8位YYYYMMDD数值的拆分结构 YY Zoned(4:0); // 前4位:年 MM Zoned(2:0); // 中间2位:月 DD Zoned(2:0); // 最后2位:日 End-Ds; // 新增报表输出用的日期字段,长度10对应MM/DD/YYYY格式 Dcl-s ReportDate Char(10);
自由格式下赋值转换逻辑如下:
// 将数值类型的订单日期赋值给Datefield整体完成自动拆分 Datefield = DODATE; // 拼接为MM/DD/YYYY格式,%char转字符后会自动补全前导零 ReportDate = %char(MM) + '/' + %char(DD) + '/' + %char(YY);
方法2:使用RPG内置日期函数实现(推荐)
不需要额外定义拆分用的数据结构,直接用内置转换函数处理,可避免人工拆分出错:
Dcl-s ReportDate Char(10); // 先将8位数值转为*ISO格式日期,再按MM/DD/YYYY格式转成字符 ReportDate = %char(%date(DODATE:*ISO0):*MDY/);
说明:
*ISO0参数对应不带分隔符的8位YYYYMMDD数值格式,*MDY/参数指定输出为带/分隔符的MM/DD/YYYY格式,自带前导零补全逻辑,不需要额外处理格式问题。
转换完成后直接把ReportDate字段放到报表打印逻辑中使用即可。
内容的提问来源于stack exchange,提问作者jaspoe30
相关产品推荐
相关产品推荐

