您好今天我遇到了时间戳转换问题。在我的网络表单中,我使用了 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,因为它在没有时区转换的情况下正确选择了数据库。
答案 0 :(得分:3)
您永远不应该从客户端到服务器传递带时区的日期,在这种情况下始终让服务器成为老板,否则您的数据库中不可避免地会出现不一致问题。
你要么:
使用关键字可以让服务器根据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');
}
这可能会帮助您同步时区