日期和时间问题是根据当地时区进行的对话

时间:2017-01-12 09:28:37

标签: javascript php mysql momentjs bootstrap-timepicker

您好今天我遇到了时间戳转换问题。在我的网络表单中,我使用了 bootstrap-datepicker ,用户可以选择日期和时间。然后我将这些值与 moment.js 转换为 unix timestamp 并将其传递给PHP页面。在PHP页面中,如果用户在不同的国家/地区,则值不同,最后在数据库中插入错误的值。 所以它的服务器时区是拉脱维亚/里加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,因为它在没有时区转换的情况下正确选择了数据库。

2 个答案:

答案 0 :(得分:3)

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

你要么:

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

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

TL; DR;

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

答案 1 :(得分: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');
}

这可能会帮助您同步时区