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

如何在PHP中将MediaWiki时间格式转换为Unix时间戳?

MediaWiki格式时间戳转Unix时间戳最优方案

针对yyyymmddhhmmss格式的UTC时间戳(如MediaWiki数据库、互联网档案馆URL中使用的格式),以下是兼顾代码简洁、转换高效、错误检测的最优转换方案:

核心思路

  1. 快速格式校验:先过滤非14位纯数字的非法输入
  2. 固定位置拆分:直接按字符串位置拆分年、月、日、时、分、秒,比正则捕获组更高效
  3. 逻辑合法性校验:初步过滤明显非法的时间数值(如月份13、日期32)
  4. UTC时间构造:使用gmmktime直接生成UTC时间戳,避免时区干扰
  5. 反向验证:修正gmmktime自动修正非法日期的问题,确保输入日期完全合法

代码实现(PHP)

function mediaWikiToUnixTimestamp($mwTs) {
    // 校验是否为14位纯数字
    if (!preg_match('/^\d{14}$/', $mwTs)) {
        return false;
    }

    // 拆分时间各部分
    $year = substr($mwTs, 0, 4);
    $month = substr($mwTs, 4, 2);
    $day = substr($mwTs, 6, 2);
    $hour = substr($mwTs, 8, 2);
    $minute = substr($mwTs, 10, 2);
    $second = substr($mwTs, 12, 2);

    // 校验各部分数值范围
    if ($month < 1 || $month > 12 
        || $day < 1 || $day > 31 
        || $hour > 23 || $minute > 59 || $second > 59) {
        return false;
    }

    // 生成UTC时间戳(参数顺序:时,分,秒,月,日,年)
    $unixTs = gmmktime($hour, $minute, $second, $month, $day, $year);

    // 反向验证,避免非法日期(如20230230)被自动修正
    if ($unixTs === false || date('YmdHis', $unixTs) !== $mwTs) {
        return false;
    }

    return $unixTs;
}

方案优势对比

  • vs strtotime:strtotime($mwTs)代码虽短,但字符串解析效率低,且无法检测20230230这类逻辑非法的日期(会被自动修正为合法日期)
  • vs 正则捕获组:正则拆分(如preg_match('/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/', $mwTs, $matches))需要额外的捕获组处理,效率低于固定位置substr拆分
  • vs mktime:mktime会使用服务器本地时区,导致UTC时间转换错误,必须用gmmktime

使用示例

// 合法输入:返回对应Unix时间戳
echo mediaWikiToUnixTimestamp('20230120171222'); // 输出1674237142

// 非法输入:返回false
echo mediaWikiToUnixTimestamp('20230230120000'); // 输出false
echo mediaWikiToUnixTimestamp('abc123'); // 输出false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:20:22