如何在PHP中将MediaWiki时间格式转换为Unix时间戳?
MediaWiki格式时间戳转Unix时间戳最优方案
针对yyyymmddhhmmss格式的UTC时间戳(如MediaWiki数据库、互联网档案馆URL中使用的格式),以下是兼顾代码简洁、转换高效、错误检测的最优转换方案:
核心思路
- 快速格式校验:先过滤非14位纯数字的非法输入
- 固定位置拆分:直接按字符串位置拆分年、月、日、时、分、秒,比正则捕获组更高效
- 逻辑合法性校验:初步过滤明显非法的时间数值(如月份13、日期32)
- UTC时间构造:使用
gmmktime直接生成UTC时间戳,避免时区干扰 - 反向验证:修正
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
相关产品推荐
相关产品推荐

