【问题标题】:Javascript Timestamp to php - mysql timestamp typeJavascript 时间戳到 php - mysql 时间戳类型
【发布时间】:2015-02-04 22:30:29
【问题描述】:

我将 javascript 时间戳数据发送到 php 以添加到我输入 TIMESTAMP 的 mysql 中:

DATABASE - startTime 类型:

现在我尝试使用 ajax,时间戳从 javascript var startTime = Date.now(); 发送到我需要转换为 mysql 的 TIMESTAMP 类型的 php...所以我尝试:

$datum = $app->request->post('startTime');
            $startTime = $datum->format('Y-m-d H:i:s'); //FIRST ATTEMP
            $startTime = date("Y-m-d H:i:s", $datum); //SECOND TRY

上面我写了两个我尝试但都不起作用的案例...我如何将其转换为正确的格式以将其添加到数据库...

你可能会问,为什么当你在 PHP 中有这个时,为什么用 JS 来获得它? 因为我的应用程序将使用澳大利亚(以及全世界)的人,而服务器在欧洲,所以如果我使用 php 服务器时间,那么我会做出错误的日期

【问题讨论】:

  • 依赖 PHP 时间戳应该没有问题,因为它可以很容易地转换为任何时区。依赖客户时间不是一个好主意。
  • 但是我怎么能去什么是用户时区,什么是用户正确的时间?用 php
  • 您无法确定时区,但您可以根据 IP 地址位置来衡量它,以便做出有根据的猜测。然而,用户应该能够将他们的时区更改为他们想要的。您可以使用 DateTime 类等 PHP 库将时间戳转换为多个时区。
  • 但是有什么方法(因为我的应用程序是基于时间任务的)在没有 JS 的情况下获取当前用户时间,所以只使用 php,以及如何?
  • 仅使用 PHP 无法获取用户的时区。这就是为什么用户应该得到一个他们可以接受或拒绝并选择正确时区的建议。您不应依赖客户端时间,因为可以通过将系统时钟更改为过去或将来的时间来轻松操纵它。根据您服务器的时区和用户的选择,您可以提供正确的日期和时间表示。

标签: javascript php mysql date timestamp


【解决方案1】:

下面的代码会将 JS 日期/时间转换为 MySQL 格式:

function SQLdate_now() {
    /* MySQL format */
    var d = new Date();
    var month = d.getMonth()+1;
    var day = d.getDate();
    var hour = d.getHours();
    var minute = d.getMinutes();
    var second = d.getSeconds();
    var output = d.getFullYear() + '-' +
        ((''+month).length<2 ? '0' : '') + month + '-' +
        ((''+day).length<2 ? '0' : '') + day + ' ' +
        ((''+hour).length<2 ? '0' :'') + hour + ':' +
        ((''+minute).length<2 ? '0' :'') + minute + ':' +
        ((''+second).length<2 ? '0' :'') + second;
    return(output);
};

【讨论】:

  • 为什么,我有时间戳,所以来自客户端的时间戳从 JS 发送到 php,我需要将时间戳转换为 mysql 的 TIMESTAMP 类型
  • 我认为 Sverri 的回答更有意义。过去我需要执行上述操作,因此我包含了该代码。
【解决方案2】:

嗯,首先,您应该确保$datum 中的数据实际上是一个数字:

$datum = $app->request->post('startTime');
if ( ! ctype_digit($datum)) {
    die('Invalid startTime!');
}

在 Javascript 中,Date.now() 方法以 毫秒 为单位返回时间戳。处理日期和类似内容的 PHP 函数使用 seconds,因此您必须通过将其除以 1000 将其转换为秒(milli 表示“千”):

$datum = ($datum / 1000);

如果您已经在浏览器中完成此操作,那么您当然应该忽略它。

在将其插入数据库之前,您必须将秒数转换为 MySQL 可以理解的格式。 DATETIME/TIMESTAMP 格式为 YYYY-MM-DD HH:MM:SS。在 PHP 中,您可以像这样格式化它:

$datum = date('Y-m-d H:i:s', $datum);

【讨论】:

  • 谢谢你的工作。还有一种方法可以在没有 JS 的情况下根据他的时区获取用户当前时间,但只需使用 php...我需要这样做,因为 JS 时间可以从用户更改...而且我的应用程序是基于时间的
  • 您可以向用户询问他们的位置,然后据此计算他们的时间。据我所知,没有万无一失的方法可以获取用户的时区/时间,除了要求它。您可以使用他们的 IP 地址和一些网络服务来查找他们的位置,但它有其自身的问题(例如,他们可能在代理后面)。
【解决方案3】:

正如我们在 cmets 中已经指出的那样,由于存在漏洞,非常不建议将客户端时间戳存储到数据库中。一个很好的折衷方案是将时区偏移量(可从 javascript 访问)保存到 cookie 中。

在 JavaScript 中,您可以像这样在几分钟内读取偏移量:

var offset = new Date().getTimezoneOffset();

保存到 cookie 后,也可以从您的 PHP 脚本中访问它,并让您能够计算正确的日期和时间字符串。

【讨论】:

  • 漏洞?它只是一个整数。如果您验证或清理数据(在任何情况下您都应该始终这样做),那么就不会有任何风险。使用客户端时间戳(和时区,就此而言)的唯一缺点是它可能不正确。除了实际询问用户它是否正确之外,我们无能为力。
  • 你是对的,但我认为保存客户端时间戳是一个相当不愉快的解决方案。
  • 是的,这并不理想。最好向用户询问他们的位置,然后据此计算时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多