如何在 PHP 中将标准 AS400 CYMD 日期格式转换为 MDY?

Posted

技术标签:

【中文标题】如何在 PHP 中将标准 AS400 CYMD 日期格式转换为 MDY?【英文标题】:How can I convert the standard AS400 CYMD date format to MDY in PHP? 【发布时间】:2013-12-29 19:07:11 【问题描述】:

我在 php 中做了很多查询。我正在显示来自这些查询的信息,但我想将日期格式更改为程序员以外的人可以轻松阅读的格式。目前我已经能够通过使用这个:

$compdt = str_split($fin47['COMPDT']);
$compdt = "$compdt[3]$compdt[4]/$compdt[5]$compdt[6]/$compdt[1]$compdt[2]"

上面的效果很好。例如,从数据库中,我返回这个日期:

1090225

在我完成数组和字符串排列后,我得到了这个:

02/25/09

但是当我从数据库返回一个 2000 年前的日期时:

960614

我在编排后得到这个:

61/4/60

这显然是不正确的,因为世纪数不存在并且年份也为零。

我刚刚遇到了一些 2000 年前的日期,并且所有格式都已关闭。是否有任何简单的方法可以翻转日期,或者我必须对 2000 年之前的日期进行第二次数组排列?

【问题讨论】:

db2 有一个 to_char 函数,允许您将日期时间值转换为您选择的格式。 【参考方案1】:

CYMD 日期具有世纪、年、月、日格式,cyymmdd,其中 c 为 0 表示 1928 年到 1999 年,为 1 表示 2000 年到 2071 年。

刚刚为你做的:http://ideone.com/6MQmWk

<?php

function cymdToTime($d) 
$matches = null;
preg_match('/^(\\d*)?(\\d\\d)(\\d\\d)(\\d\\d)$/', $d, $matches);
return strtotime( (($matches[1] + 19) * 100 + $matches[2]) . '-' . $matches[3] . '-' . $matches[4]);


echo strftime('%B %d, %Y', cymdToTime(960614)); // June 14, 1996
echo strftime('%B %d, %Y', cymdToTime(1090225)); // February 25, 2009

【讨论】:

【参考方案2】:

一个简单的UDF可用于在主机上将CYMD转换为SQL DATE格式:

CREATE FUNCTION QGPL.CYMDTODATE(IN DEC(7)) RETURNS DATE
LANGUAGE SQL
DETERMINISTIC
RETURNS NULL ON NULL INPUT
BEGIN
    RETURN(DATE(
        SUBSTR(DIGITS(19000000+IN),2,4) || '-' ||
        SUBSTR(DIGITS(IN),4,2) || '-' ||
        SUBSTR(DIGITS(IN),6,2)));
END

可以这样使用:

SELECT QGPL.CYMDTODATE(COMPDT) COMPDT 
FROM MYLIB.MYTABLE

【讨论】:

以上是关于如何在 PHP 中将标准 AS400 CYMD 日期格式转换为 MDY?的主要内容,如果未能解决你的问题,请参考以下文章

将 PHP 连接到 IBM i (AS/400)

如何在 SSIS 中将 Y2K 日期转换为 SQL 日期?

如何将 NewProxyConnection 类型转换为 AS400JDBCConnection

根据 AS400 SQL 中的不同条件更新 SQL 中的相同字段

AS400如何查看用户操作日志

如何调用采用日期参数的 DB2 AS400 表值函数