【问题标题】:Date transformation JavaScript to PHP日期转换 JavaScript 到 PHP
【发布时间】:2019-01-21 22:48:50
【问题描述】:

我在前端使用this Vue component,它允许我的用户选择日期和时间。事实上,这提供了 ISO 8601 格式的日期/时间。然后我这样做是为了转换数据库:

$dt = $request->pickup_date_time;
$formattedDt = date('Y-m-d H:i:s', strtotime($dt));

但是,我发现当客户端和服务器之间存在时区差异时,转换后的日期会关闭。

例如,德克萨斯州的用户可能选择上午 10 点作为时间,但当它在服务器上处理时,它被转换为下午 4 点(德克萨斯州和伦敦之间的时差为 6 小时)。

最好的转换方式是什么,以便我们始终存储用户选择的时间?

【问题讨论】:

  • 它非常广泛和固执己见,因为那里有许多不同的解决方案。有些使用 unix 时间戳,有些使用只有 UTC 的 ISO 格式,有些接受时区偏移并进行相应的转换。

标签: javascript php datetime iso8601


【解决方案1】:

如果您将 pick_date_time 作为 UNIX 时间戳发布并保存,则无需在 php 级别进行任何字符串解析。然后你可以在 JS 中使用该时间戳在浏览器的时区中进行渲染。

【讨论】:

  • 是的,我无法更改从前端发布的内容的格式
【解决方案2】:

实际的 ISO8601 规范包括时区。如果未在字符串中指定,则接收服务器将做出可能不正确的假设。所以解决方案是在日期字符串中包含时区。

$preferred_timezone = new DateTimeZone('America/Vancouver');
$t = new DateTime('now', $preferred_timezone);

var_dump(
    $t->format('c'),
    $t->format(DateTime::ISO8601),
    $t->format('Y-m-d H:i:sP')
);

输出:

string(25) "2019-01-21T16:39:08-08:00"
string(24) "2019-01-21T16:39:08-0800"
string(25) "2019-01-21 16:39:08-08:00"

如果接收方无法正确处理时区并且只是假装是 ISO8601-ish 那么您需要配置您的应用程序以了解远程服务器正在等待并进行相应的翻译。

$preferred_timezone = new DateTimeZone('America/Vancouver');
$remote_timezone = new DateTimeZone('Europe/Paris');

$t = new DateTime('now', $preferred_timezone);
$t->setTimeZone($remote_timezone);

var_dump(
    $t->format('Y-m-d H:i:s')
);

输出:

string(19) "2019-01-22 01:42:54"

【讨论】:

    【解决方案3】:

    您需要找到服务器和用户之间的时区差异。为此,您需要使用 javascript 和 jquery。

    我们将使用 jquery 获取时区偏移并将其存储在会话中。在将用户的日期插入数据库之前,我们将添加此偏移量。

    查看getTimezoneOffset (javascript)

    第 1 步:如果发布时区偏移量,请将其存储在 user_timezone isset 中。

    第二步:如果没有设置user_timezone,则获取。

    第 3 步:将此偏移量添加到用户选择的日期。然后将其插入数据库。

    让我们创建一个新的 php 文件。并在让用户选择日期之前包含它。

        <?php
            if (!isset($_SESSION)) {
                session_start();
            }
            //If timezone_offset is posted, save it as user_timezone
             if (isset($_POST['timezone_offset'])) {
                $_SESSION['user_timezone'] = $_POST['timezone_offset'];
            }
            //If user_timezone is not exist, get it.
            else if (!isset($_SESSION['user_timezone'])) {
        ?>
            //Include jQuery
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
            <script>
                $(document).ready(function(){
                    var url = location.href;
                    var timezone_offset = new Date().getTimezoneOffset();
                        var posting = $.post( url, { timezone_offset: timezone_offset } );
                        posting.done(function() {
                            location.reload();
                        });
                });
            </script>
        <?php
            }
        ?>
    

    我们得到了偏移量。现在让我们将此偏移量添加到日期。

    $dt = $request->pickup_date_time;
    $Fdate = strtotime($dt) + (60 * $_SESSION['user_timezone']);
    

    现在,您可以将 $Fdate 插入数据库。

    用于在本地时区显示此日期:

    $Fdate = $Fdate - (60 * $_SESSION['user_timezone']);
    $formattedDt = date('Y-m-d H:i:s', $Fdate);
    

    对不起,我的英语不是我的母语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多