php - 表单日期验证问题

标签 php forms date timezone

我正在构建一个简单的日期验证脚本,但我偶然发现了一个大问题。

$correct_date = FALSE;
if ($legal_month == $month_wozero || $legal_month == $month_wzero) {
    if ($legal_day == $day_wzero || $legal_day == $day_wozero) {
        if ($legal_year == $year)
            $correct_date = TRUE;
    }
}

$legal_day, $legal_month, $legal_year = user input

$day_wozero/wzero, $month_wozero/wzero, $year = server time

用户需要输入他们下订单的日期。但很明显,这永远不会与我设置脚本的方式一起工作。公司所在地距离服务器 -2 小时。但这并不重要,因为有人可以在美国的任何地方下订单。因此,如果他们在纽约,可能是第二天,而公司在洛杉矶,日期会有所不同。它也可能是该月的最后一天,纽约的月份也与洛杉矶不同。

在我看来,解决这个问题的唯一方法是构建一个完整的 if/else 嵌套规则集,以针对特定时间的时间和月份差异进行调整。但我几乎可以肯定,必须有另一种我不知道的解决方法。

有什么建议吗?

最佳答案

我会选择添加一个时区下拉列表,并尝试使用 JS 为他们选择正确的时区,这样您就可以高枕无忧了,因为它是从客户端提供给您的。

在您的服务器上收到数据后,您应该使用此信息将用户日期转换为服务器的时区并进行比较,或者创建一个在用户提供的时区中的服务器日期值并进行检查。

示例

// We'll want this for later
$server_timezone = date_default_timezone_get();

// Did the user supply a timezone and is it valid?
if(
    $_POST['user_supplied_timezone'] !== '' &&
    date_default_timezone_set($_POST['user_supplied_timezone']) === TRUE
)
{
    // This accepts yyyy/m/d or yyyy/mm/dd formats
    if(
        $_POST['user_year'] === date('Y') &&
        ($_POST['user_month'] === date('n') || $_POST['user_month'] === date('m')) &&
        ($_POST['user_day'] === date('j') || $_POST['user_day'] === date('d'))
    )
    {
        // TRUE
    }
}

// It is officially "later"
date_default_timezone_set($server_timezone);

关于php - 表单日期验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29975902/

相关文章:

ms-access - 您如何在 MS Access 查询中格式化日期以防止美国/英国问题

php - php 的 date_default_timezone_set 是否调整为夏令时?

php - Dokan 插件为单个订单的客户发送多封电子邮件

php - MySQLi PHP : Check if SQL INSERT query was fully successful using MySQLi

php - POST 变量没有改变

javascript - 如何使用带有 .reset() 方法的 jQuery 重置表单

php - 正则表达式 - 匹配(仅)具有混合字符的单词

php - Google Firebase 通知无法订阅主题

javascript - 在一页上使用具有多个表单的日期选择器

mysql - 将格式化日期从 Excel 复制到记事本