You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用DateTime::createFromFormat()解析带时区的PostgreSQL datetime(含可选微秒)

解析PostgreSQL带时区Datetime的PHP解决方案

首先得明确PostgreSQL的TIMESTAMP WITH TIME ZONE通常会输出两种常见格式:一种带时区偏移(如±HH:MM),另一种带时区缩写(如UTC)。你遇到的第一个日期解析失败,大概率是格式字符串和日期的实际格式不匹配,下面分情况给你对应解决方案:

情况1:日期带时区偏移(如2024-05-20 14:30:00+00:00

这种格式用P格式符来匹配时区偏移部分,对应的$format参数是'Y-m-d H:i:sP',示例代码:

$pgDate = '2024-05-20 14:30:00+00:00';
$format = 'Y-m-d H:i:sP';
$dateObj = DateTime::createFromFormat($format, $pgDate);

if ($dateObj) {
    // 验证解析结果,比如转成你需要的格式
    echo $dateObj->format('Y-m-d H:i:s T');
} else {
    echo "解析失败,检查日期格式是否匹配";
}

情况2:日期带时区缩写(如2024-05-20 14:30:00 UTC

这种格式用T格式符匹配时区缩写,对应的$format参数是'Y-m-d H:i:s T',示例代码:

$pgDate = '2024-05-20 14:30:00 UTC';
$format = 'Y-m-d H:i:s T';
$dateObj = DateTime::createFromFormat($format, $pgDate);

if ($dateObj) {
    echo $dateObj->format('Y-m-d H:i:s T');
} else {
    echo "解析失败,确认时区缩写是否在PHP时区数据库中存在";
}

额外提示

  • 如果PostgreSQL输出的是ISO 8601标准格式(如2024-05-20T14:30:00+00:00),直接用'c'作为格式符即可,它会自动匹配完整的ISO带时区格式。
  • 要是不确定日期的具体格式,可以先把无法解析的日期字符串打印出来,对照PHP日期格式符表(比如Y对应4位年、m对应2位月等)逐个对应构造$format
  • 解析完成后,若需要转换时区,可以调用$dateObj->setTimezone(new DateTimeZone('Asia/Shanghai'))来调整。

内容的提问来源于stack exchange,提问作者venca

火山引擎 最新活动