0

0

PHP日期格式化与DNI验证:常见陷阱与修正

心靈之曲

心靈之曲

发布时间:2025-10-04 14:18:15

|

630人浏览过

|

来源于php中文网

原创

PHP日期格式化与DNI验证:常见陷阱与修正

本教程旨在解决PHP开发中常见的两个问题:不正确的日期格式显示(Unix时间戳)和DNI(西班牙国民身份证)验证中的错误函数使用。我们将详细介绍如何正确地使用date()函数格式化日期,并替换DNI验证中错误的JavaScript函数(.length和isNaN)为PHP的strlen()和is_numeric(),以确保代码的准确性和健壮性。

php web开发中,处理用户输入是核心环节,这包括日期处理和表单数据验证。然而,开发者常会遇到一些陷阱,例如日期格式化不当导致显示原始unix时间戳,或者混淆不同编程语言的函数导致验证逻辑失效。本文将深入探讨这两个常见问题,并提供专业的解决方案。

一、PHP日期格式化:从Unix时间戳到可读日期

在PHP中,日期和时间的处理是常见需求。当从用户输入(如HTML )获取日期并进行计算后,如果直接使用gmdate()或不带格式参数的date(),可能会得到一个难以理解的Unix时间戳。

问题分析:

InsCode
InsCode

InsCode 是CSDN旗下的一个无需安装的编程、协作和分享社区

下载

原始代码中,期望显示“日期 + 10天”的结果,但实际输出却是Fecha de vuelta: 1637794800这样的数字串。这表明gmdate()函数被错误地使用,或者缺少了必要的格式化参数。

// 原始错误代码示例
echo "Fecha de vuelta: ".gmdate(strtotime($_GET['fechaalquiler']."+ 10 days"))."
";

这里的问题在于:

立即学习PHP免费学习笔记(深入)”;

  1. strtotime($_GET['fechaalquiler']."+ 10 days"):这个函数成功地将日期字符串解析并计算出10天后的Unix时间戳,例如1637794800。
  2. gmdate():此函数通常用于将Unix时间戳格式化为GMT/UTC日期字符串。然而,如果只传入一个Unix时间戳作为唯一参数,它会尝试将其解释为格式字符串,从而导致不可预期的行为或默认输出。更常见的是,它期望第一个参数是格式字符串,第二个参数才是时间戳。

解决方案:

要将Unix时间戳转换为人类可读的日期格式,应该使用date()函数,并为其提供一个明确的格式字符串。date()函数接受两个主要参数:第一个是输出日期时间的格式,第二个是可选的Unix时间戳(如果省略,则默认为当前时间)。

// 正确的日期格式化代码
if (isset($_GET['fechaalquiler']) && !empty($_GET['fechaalquiler'])) {
    // strtotime() 解析日期字符串并计算10天后的Unix时间戳
    $timestamp = strtotime($_GET['fechaalquiler'] . "+ 10 days");
    // date() 函数将Unix时间戳格式化为 '年-月-日 时:分:秒' 格式
    echo "Fecha de vuelta: " . date('Y-m-d H:i:s', $timestamp) . "
"; } else { echo "Fecha no introducida
"; }

在上述代码中:

  • 'Y-m-d H:i:s' 是一个日期格式字符串,它指示date()函数将输出格式化为四位年份、两位月份、两位日期、两位小时(24小时制)、两位分钟和两位秒。
  • $timestamp 是由strtotime()计算得出的Unix时间戳。

注意事项:

  • date()函数默认使用服务器的时区设置。如果需要处理特定时区或GMT/UTC时间,可以使用DateTime对象或gmdate()配合正确的格式字符串。
  • 在实际应用中,建议使用!empty($_GET['fechaalquiler'])来检查变量是否为空,因为它能同时处理null、空字符串和0等“空”值,比!==null && !==''更简洁。

二、PHP DNI验证:避免JavaScript函数混淆

在进行表单数据验证时,尤其是在处理特定格式的输入(如DNI、身份证号等)时,确保使用对应编程语言的正确函数至关重要。将JavaScript中的函数误用于PHP代码是常见的错误,这会导致验证逻辑完全失效。

问题分析:

原始代码中,DNI验证部分使用了.length和isNaN这两个JavaScript中的属性和函数,这在PHP中是无效的。

// 原始错误代码示例
else if ($_GET['dni'].length!==9 || isNaN(substr(($_GET['dni']), 0, 8))) {
    echo "DNI incorrecto";
}

这里的问题在于:

立即学习PHP免费学习笔记(深入)”;

  1. $_GET['dni'].length:在JavaScript中,.length用于获取字符串的长度。但在PHP中,点号.是字符串连接符,$_GET['dni']是一个字符串,尝试对其使用.length会引发语法错误或不符合预期的行为(例如,如果PHP版本较低,可能会被忽略或导致类型转换)。
  2. isNaN():在JavaScript中,isNaN()用于检查一个值是否为“非数字”。但在PHP中,没有名为isNaN()的内置函数。PHP提供了is_numeric()来检查一个变量是否为数字或数字字符串。

解决方案:

要正确地在PHP中获取字符串长度和检查是否为数字,应该使用PHP内置的strlen()和is_numeric()函数。

// 正确的DNI验证代码
if (isset($_GET['dni']) && !empty($_GET['dni'])) {
    $dni = $_GET['dni'];
    // 检查DNI长度是否为9
    if (strlen($dni) !== 9) {
        echo "DNI incorrecto: 长度必须为9位。
"; } // 检查DNI前8位是否为数字 else if (!is_numeric(substr($dni, 0, 8))) { echo "DNI incorrecto: 前8位必须是数字。
"; } // 检查DNI的字母是否正确 else { $numero = (int)substr($dni, 0, 8); $letraCorrecta = substr("TRWAGMYFPDXBNJZSQVHLCKEO", $numero % 23, 1); $letraRecibida = substr($dni, 8, 1); if ($letraCorrecta === $letraRecibida) { echo "DNI correcto
"; } else { echo "DNI incorrecto; 正确的字母应为 " . $letraCorrecta . "
"; } } } else { echo "DNI no introducido
"; }

在上述代码中:

  • strlen($dni):用于获取$dni字符串的长度。
  • is_numeric(substr($dni, 0, 8)):用于检查$dni的前8位子字符串是否为纯数字。!运算符用于判断其是否“不是数字”。

DNI验证逻辑优化:

为了提高代码的可读性和逻辑的清晰性,建议将多个验证条件拆分开来,并按照优先级进行检查。

// 优化后的DNI验证逻辑
if (isset($_GET['dni']) && !empty($_GET['dni'])) {
    $dni = $_GET['dni'];

    // 1. 检查DNI长度
    if (strlen($dni) !== 9) {
        echo "DNI incorrecto: 长度必须为9位。
"; } // 2. 检查DNI前8位是否为数字 else if (!is_numeric(substr($dni, 0, 8))) { echo "DNI incorrecto: 前8位必须是数字。
"; } // 3. 检查DNI的字母是否正确 else { $numero = (int)substr($dni, 0, 8); $letraCalculada = substr("TRWAGMYFPDXBNJZSQVHLCKEO", $numero % 23, 1); $letraIntroducida = strtoupper(substr($dni, 8, 1)); // 转换为大写进行比较 if ($letraCalculada === $letraIntroducida) { echo "DNI correcto
"; } else { echo "DNI incorrecto; 正确的字母应为 " . $letraCalculada . "
"; } } } else { echo "DNI no introducido
"; }

完整代码示例:


    
        lapuente_de la pena_blanca_ModuloDWES_TareaEvaluativa02.php
    
    
        ";
            } else {
                echo "Fecha no introducida 
"; } // DNI验证 if (isset($_GET['dni']) && !empty($_GET['dni'])) { $dni = $_GET['dni']; if (strlen($dni) !== 9) { echo "DNI incorrecto: 长度必须为9位。
"; } else if (!is_numeric(substr($dni, 0, 8))) { echo "DNI incorrecto: 前8位必须是数字。
"; } else { $numero = (int)substr($dni, 0, 8); $letraCalculada = substr("TRWAGMYFPDXBNJZSQVHLCKEO", $numero % 23, 1); $letraIntroducida = strtoupper(substr($dni, 8, 1)); if ($letraCalculada === $letraIntroducida) { echo "DNI correcto
"; } else { echo "DNI incorrecto; 正确的字母应为 " . $letraCalculada . "
"; } } } else { echo "DNI no introducido
"; } } ?>
"?>

总结

本教程详细解决了PHP开发中常见的两个问题:日期格式化不当和DNI验证中混淆JavaScript与PHP函数。通过使用date('Y-m-d H:i:s', strtotime(...))可以正确格式化日期,而strlen()和is_numeric()则是PHP中用于字符串长度和数字检查的正确函数。掌握这些基础知识对于编写健壮、可维护的PHP代码至关重要。在开发过程中,务必注意编程语言的特性和内置函数,避免跨语言概念的混淆,以确保程序的正确性和稳定性。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2696

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1665

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1527

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1443

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1509

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号