You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP正确修改LDAP中的Generalized Time属性?

解决PHP中LDAP Generalized Time类型字段修改的无效语法问题

你遇到的核心问题是LDAP的Generalized Time类型有严格的格式要求,你当前的写法要么格式不符合规范,要么因为PHP的数值运算破坏了正确格式,导致ldap_modify()返回无效语法错误。下面一步步给你解决:

先明确正确的Generalized Time格式

LDAP定义的Generalized Time有两种合法格式:

  • UTC时区格式:YYYYMMDDHHMMSSZ(末尾必须加Z表示UTC时间)
  • 带时区偏移的格式:YYYYMMDDHHMMSS±HHMM(比如东1区写+0100,西5区写-0500,注意是完整字符串,不能拆成数字运算)

你的代码里20180307155845+0100被当成了数值计算,结果变成了20180307155845100,完全不符合格式要求,这是关键错误。

修改后的正确代码示例

<?php
$ds = ldap_connect(/*hostname*/);
ldap_bind($ds, /*binddn*/, /*bindpw*/);
// 建议用常量代替数字3,可读性更强,3对应LDAPv3协议
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

$new = array();
// 方式1:直接写符合规范的UTC格式字符串
$new["expirationDate"] = "20180307145845Z";
// 方式2:带时区偏移的字符串(必须用引号包裹,不能做数字运算)
// $new["expirationDate"] = "20180307155845+0100";

$modify = ldap_modify($ds, /*dn of the object*/, $new);
if(!$modify) {
    echo ldap_error($ds);
}
?>

用PHP DateTime类自动生成合规格式

如果需要动态生成时间,推荐用DateTime类来避免手动拼接出错:

// 生成带时区偏移的格式
$date = new DateTime('2018-03-07 15:58:45', new DateTimeZone('Europe/Paris'));
$generalizedTime = $date->format('YmdHisO'); // 输出:20180307155845+0100

// 或者生成UTC的Z格式
$date->setTimezone(new DateTimeZone('UTC'));
$generalizedTimeUtc = $date->format('YmdHis\Z'); // 输出:20180307145845Z

$new["expirationDate"] = $generalizedTime;

关键注意事项

  • 必须确保传递给ldap_modify的是字符串类型,绝对不能是数值,否则PHP会自动转换格式破坏LDAP要求的结构
  • 不要省略时间部分,20180121这种仅日期的格式不符合Generalized Time的完整定义
  • 时区偏移的符号和数字必须连在一起,不能有空格

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:37:10