1

您好,今天我遇到了时间戳转换问题。在我的网络表单中,我使用的是引导日期选择器,用户可以在其中选择日期和时间。之后我用moment.js将这些值转换为unix 时间戳并将其传递给 PHP 页面。在 PHP 页面中,如果用户在不同的国家/地区,则该值不同,最终在数据库中插入了错误的值。因此,就像服务器时区是Latvia/Riga GMT+2而来自Georgia/Tbilisi 的用户有 GTM+4。他选择开始日期12.01.2017 15:00,Moment.js 将其传递给 PHP 页面中的开始日期的 DB 值插入12.01.2017 13:00

这是来自js的代码

var start_date = $("#start_date").val();
var start_time = $("#start_time").val();
var start = moment.utc(start_date + ' ' + start_time, "DD.MM.YYYY HH:mm").tz("Europe/Riga");

之后 var 通过 ajax 传递给 PHP 脚本,例如start.unix()

在 PHP 中它接收

$startDate      = date('Y-m-d H:i:s', $_GET['start']);

时间提前 2 小时收到。我该怎么做才能让用户从世界上任何地方选择时间 PHP 插入 DB,因为它选择正确,没有时区转换。

4

2 回答 2

3

您永远不应该从客户端到服务器传递带有时区的日期,在这种情况下始终让服务器成为老板,否则您的数据库中不可避免地会出现不一致问题。

你要么:

  • 始终使用 UTC+0 日期。
  • 使用代表日期的关键字(即昨天、现在、两天前)。

使用关键字可以让服务器根据 UTC+0 时区决定您想要哪个日期。

TL;博士;

始终使用 UTC+0 日期时间并将它们转换为服务器/客户端(这是您的偏好),具体取决于用户所在的时区。

于 2017-01-12T09:34:54.833 回答
0

您可以使用以下 JS 在 JS 中获取客户端时区:

var time_zone = Intl.DateTimeFormat().resolvedOptions().timeZone;
var start_date = $("#start_date").val();
var start_time = $("#start_time").val();

在 PHP 中:

function getDateTime($start_date, $start_time, $time_zone) {
    $dateTime = $start_date . ' ' . $start_time;
    $date = new DateTime($dateTime, new DateTimeZone($time_zone));

    $serverTimeZone = date_default_timezone_get();
    $date->setTimezone(new DateTimeZone($serverTimeZone));
    return $date->format('Y-m-d H:i:sP');
}

这可能会帮助您同步时区

于 2017-01-12T09:47:07.427 回答