PHP date() 函数

PHP date() 函数中文讲解

什么是 PHP date() 函数?

date() 函数是 PHP 内置函数,用于格式化时间戳或当前日期时间,返回指定格式的字符串。它是处理日期和时间的常用工具,广泛应用于显示日期、记录日志、生成时间戳等场景。

基本语法
string date(string $format [, int $timestamp = time()])
  • $format:必需,指定输出日期的格式,使用特定的格式字符。
  • $timestamp:可选,Unix 时间戳(秒数),默认使用当前时间(time())。
  • 返回值:格式化后的日期字符串。
常见格式字符

date() 函数使用格式字符定义输出样式,以下是常用的格式字符:

  • 年份
    • Y:四位年份(如 2025)
    • y:两位年份(如 25)
  • 月份
    • m:两位数字月份(01-12)
    • F:完整月份名(如 July)
    • M:短月份名(如 Jul)
  • 日期
    • d:两位数字日期(01-31)
    • j:不补零的日期(1-31)
  • 星期
    • l:完整星期名(如 Monday)
    • D:短星期名(如 Mon)
  • 时间
    • H:24 小时制(00-23)
    • h:12 小时制(01-12)
    • i:分钟(00-59)
    • s:秒(00-59)
    • A:大写 AM/PM
    • a:小写 am/pm
  • 其他
    • T:时区(如 HKT)
    • U:Unix 时间戳(秒数)
基本示例
  1. 显示当前日期时间

    <?php
    echo date("Y-m-d H:i:s"); // 输出:2025-07-14 19:16:00
    ?>
    
  2. 自定义格式

    <?php
    echo date("l, F j, Y"); // 输出:Monday, July 14, 2025
    ?>
    
  3. 使用指定时间戳

    <?php
    $timestamp = mktime(0, 0, 0, 1, 1, 2020); // 2020-01-01 00:00:00
    echo date("Y-m-d", $timestamp); // 输出:2020-01-01
    ?>
    
结合表单处理

date() 函数常用于处理表单中的日期数据,例如记录提交时间或格式化用户输入的日期。

示例:记录表单提交时间
  1. HTML 表单 (form.html):

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>提交记录</title>
        <style>
            .error { color: red; }
            label { display: inline-block; width: 100px; }
            input { margin-bottom: 10px; }
        </style>
    </head>
    <body>
        <h2>提交记录</h2>
        <form action="process.php" method="post">
            <?php
            session_start();
            if (empty($_SESSION['csrf_token'])) {
                $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
            }
            ?>
            <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
            <label for="name">姓名*:</label>
            <input type="text" id="name" name="name" value="<?php echo isset($_POST['name']) ? htmlspecialchars($_POST['name']) : ''; ?>">
            <br>
            <input type="submit" value="提交">
            <p>* 表示必需字段</p>
        </form>
    </body>
    </html>
    
  2. PHP 处理脚本 (process.php):

    <?php
    session_start();
    
    // 初始化错误数组
    $errors = [];
    
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        // 验证 CSRF 令牌
        if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
            $errors[] = "CSRF 验证失败";
        } else {
            // 获取并清理输入
            $name = trim($_POST['name'] ?? '');
            $name = filter_var($name, FILTER_SANITIZE_STRING);
            $name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
    
            // 验证必需字段
            if (empty($name)) {
                $errors[] = "姓名是必需字段";
            }
    
            // 如果没有错误,记录提交时间并保存
            if (empty($errors)) {
                try {
                    $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
                    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
                    // 使用 date() 获取当前时间
                    $submit_time = date("Y-m-d H:i:s");
    
                    // 插入数据
                    $stmt = $pdo->prepare("INSERT INTO submissions (name, submit_time) VALUES (:name, :submit_time)");
                    $stmt->execute([
                        'name' => $name,
                        'submit_time' => $submit_time
                    ]);
                    echo "提交成功!<br>";
                    echo "姓名: $name<br>";
                    echo "提交时间: $submit_time";
                    $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 重置 CSRF 令牌
                    exit;
                } catch (PDOException $e) {
                    $errors[] = "数据库错误: " . $e->getMessage();
                }
            }
        }
    }
    
    // 显示错误并回显表单
    if (!empty($errors)) {
        echo "<div class='error'><ul>";
        foreach ($errors as $error) {
            echo "<li>$error</li>";
        }
        echo "</ul></div>";
    }
    include 'form.html';
    ?>
    
  3. 数据库表结构 (submissions 表):

    CREATE TABLE submissions (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        submit_time DATETIME NOT NULL
    );
    
关键点解析
  • 格式化输出date("Y-m-d H:i:s") 生成本地时间格式,适合数据库存储。
  • 时区设置:确保正确时区,使用 date_default_timezone_set()
    date_default_timezone_set('Asia/Hong_Kong'); // 设置为 HKT 时区
    echo date("Y-m-d H:i:s T"); // 输出:2025-07-14 19:16:00 HKT
    
  • 安全性
    • 使用 htmlspecialchars() 防止 XSS。
    • 使用 PDO 预处理语句防止 SQL 注入。
    • 添加 CSRF 令牌防止跨站请求伪造。
  • 用户体验:回显用户输入,显示具体错误提示。
常见问题与解决方案
  1. 时区问题
    如果时间不正确,检查服务器时区:

    date_default_timezone_set('Asia/Hong_Kong');
    

    或在 php.ini 中设置:

    date.timezone = Asia/Hong_Kong
    
  2. 无效时间戳
    如果时间戳无效,date() 返回 false

    $result = date("Y-m-d", -1);
    if ($result === false) {
        echo "无效时间戳";
    }
    
  3. 格式化复杂日期
    组合多种格式字符:

    echo date("l, F j, Y g:i A"); // 输出:Monday, July 14, 2025 7:16 PM
    
最佳实践
  • 设置时区:始终在脚本开头设置时区,避免默认 UTC 或服务器时区问题。
  • 验证输入:结合 $_POST$_GET 时,验证用户输入的日期格式:
    $user_date = $_POST['date'] ?? '';
    if (!strtotime($user_date)) {
        $errors[] = "无效的日期格式";
    }
    
  • 使用 DateTime 类:对于复杂日期操作,考虑使用 DateTime 类:
    $date = new DateTime();
    echo $date->format("Y-m-d H:i:s");
    
  • 错误处理:检查 date() 返回值,确保格式化成功。
  • 安全输出:对动态输出的日期字符串使用 htmlspecialchars()
参考资源
总结

PHP 的 date() 函数是格式化日期和时间的简单工具,通过丰富的格式字符支持灵活输出。结合表单处理和数据库操作,date() 可用于记录时间戳、显示用户友好的日期等场景。注意时区设置、输入验证和安全措施(如 XSS 和 CSRF 防护),可确保应用健壮性。上述示例展示了如何将 date() 集成到表单处理中,适合日志记录、用户提交等实际场景。

PHPdate函数用于格式化时间或日期。它的第一个参数是格式化字符串,用于指定时间戳的输出格式。第二个参数是可选的,用于指定时间戳。如果不提供第二个参数,默认使用当前的日期和时间。\[3\] 例如,要将时间戳转换为年-月-日 时:分:秒的格式,可以使用以下代码: ``` $t = time(); echo date("Y-m-d H:i:s", $t); ``` 这将输出当前时间的格式化字符串。\[1\] 需要注意的是,时间戳是一个表示从1970年1月1日到现在经过的秒数的数字。因此,如果要获取前一天的时间,可以使用`time() - 60*60*24`,如果要获取前一年的时间,可以使用`time() - 60*60*24*365`。\[1\] #### 引用[.reference_title] - *1* *3* [php date函数介绍与使用方法详解](https://blog.csdn.net/weixin_29322855/article/details/116347131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PHP源码之date函数](https://blog.csdn.net/barebear007/article/details/82454640)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值