【问题标题】:php - comparing entered date with current date and getting wrong result because server timezone is different than entered timezonephp - 将输入的日期与当前日期进行比较并得到错误的结果,因为服务器时区与输入的时区不同
【发布时间】:2015-11-06 19:47:51
【问题描述】:

我有一个表单,用户将在其中输入电子邮件活动的日期和时间。作为表单验证的一部分,我确认用户输入了未来的日期。

当前服务器默认时区为 UTC。

用户将以字符串形式输入预定的日期和时间(由 JQuery 日期和时间选择器生成)。

输入的字符串被转换为时间戳,然后与当前日期和时间进行比较。

如果输入的日期和时间早于当前日期和时间,则不会提交表单并通知用户重新输入未来的日期。

问题是,如果用户在当前时间(太平洋时区)的未来 8 小时内输入未来时间和日期和时间,系统会认为它是过去的,因为服务器时区是 UTC (比太平洋标准时间早 8 小时)。

我尝试使用 gmdate 将用户输入转换为 UTC,如下所示:

//$timeEntered is a string, like 2015/11/06 19:27:21:
$timeEntered = $_POST['date_and_time'] 
$theEnteredTimeInUnixTimestamp = strtotime ( $timeEntered );
$enteredTimeInGMT =  gmdate('Y-m-d H:i:s', $theEnteredTimeInUnixTimestamp );

但它不会转换它。我是否应该在输入的日期和时间上增加 8 小时,使其与当前服务器时间 (UTC) 匹配?那将是愚蠢的,因为这会在夏令时发生变化。

是否应该在进行比较时将当前服务器时区更改为太平洋时间,以便时区匹配?如果用户处于不同的时区,这将产生意想不到的结果。我不知道如何处理这个问题,让它可靠地将输入的时间与当前时间进行比较并给出正确的结果。

【问题讨论】:

    标签: php mysql date datetime


    【解决方案1】:
    $user_date_str = '2015/11/06 19:27:21';
    $user_tz = 'America/Los_Angeles';
    $server_tz = 'UTC';
    
    // Get a DateTime object for the user entered time
    $user_datetime = new DateTime($user_date_str, new DateTimeZone($user_tz) );
    // Change time zone to the same as the server
    $user_datetime->setTimeZone(new DateTimeZone($server_tz));
    
    // Get a DateTime object for the current server time
    $server_datetime = new DateTime();
    // If the PHP timezone isn't set correctly, you can also do:
    //$server_datetime = new DateTime(null, new DateTimeZone($server_tz) );
    
    // Now compare
    if ($user_datetime < $server_datetime) {
        // handle the error
    }
    

    【讨论】:

    • 感谢您的回答 - 这是正确的,但我认为确保比较结果正确的唯一方法(如果用户恰好位于与 PST 不同的时区)是在表单上询问他们所在的时区,将 $user_tz 设置为他们输入的任何时区,然后进行比较。
    • 是的,您需要知道用户所在的时区,否则将无法进行转换。
    【解决方案2】:

    strtotime() 不是魔法。您不能只是将任何旧日期放在那里并期望得到有效的结果。看起来如果您将反斜杠更改为连字符,它应该可以工作。有关在 strtotime 中使用的有效日期格式,请参阅此页面:http://php.net/manual/en/datetime.formats.compound.php

    编辑....

    其实你的 strtotime 电话没问题..https://3v4l.org/vCsDb

    我想这就是你要找的东西..http://php.net/manual/en/function.date-default-timezone-set.php

    调用该页面顶部的date_default_timezone_set ('America/Los_Angeles').. 使用正确的时区...

    Eastern ........... America/New_York
    Central ........... America/Chicago
    Mountain .......... America/Denver
    Mountain no DST ... America/Phoenix
    Pacific ........... America/Los_Angeles
    Alaska ............ America/Anchorage
    Hawaii ............ America/Adak
    Hawaii no DST ..... Pacific/Honolulu
    

    http://php.net/manual/en/timezones.america.php

    【讨论】:

    • 是的,感谢您的回答 - 我仔细检查了 strtotime() 函数的输入是否正确,并将反斜杠更改为连字符,然后注意到您编辑了答案并确认 strtotime 调用是反正很好。在这种情况下调用 date_default_timezone_set 是可行的,但如果用户想从不同的时区为新广告系列设置日期和时间怎么办?
    • 我认为完全确保正确结果的唯一方法是询问用户所在的时区,然后将服务器时区设置为他们提交的任何内容,然后进行比较。我希望 gmdate() 可以神奇地将用户输入的时间转换为 GMT,无论他们在哪个时区,但现在我发现这是不可能的。
    • 是的,您可以使用一些 javascript 来获取用户端的系统时间,但最好的办法是询问他们。或者至少询问他们的城市/州并从那里推断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2023-03-06
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多