Py学习  »  DATABASE

MySQL和PHP UTC时间在数字格式时不同

Soulss • 3 年前 • 1510 次点击  

我正在尝试建立一个登录系统,为了重置密码或确认帐户,我有一个带有“过期日期”的列,为了让过期在任何地方都有效,我将存储在UTC时间。但我遇到了一些非常奇怪的事情。当我拿到 格式化 来自SQL和 格式化 来自PHP的UTC时间,两者都是相同的。但当我进去的时候 数字 (我不知道这种格式的真实名称是什么)它们的差别正好是7200(相当于2小时的差别)。如果有人知道为什么会这样?谢谢

下面是我用来调试的代码:

<?php

$con = mysqli_connect('localhost', 'root', '', 'clients');

updateUserUTCTime($con, 3);
$user = getUserAssocArray($con, 3);

echo $user['date_utc'];
echo '<br>';
echo gmdate("Y-m-d H:i:s", time());
echo '<br>';
echo '<br>';
echo strtotime($user['date_utc']);
echo '<br>';
echo gmdate(time());
echo '<br>';
echo '____________';
echo '<br>';
echo strtotime($user['date_utc']) - gmdate(time());

function updateUserUTCTime($con, $id=1){
    $query = '
    update datetests 
    set date_utc = UTC_TIME()
    where id = '.$id.'
    ;';

    return mysqli_query($con, $query);
}

function getUserAssocArray($con, $id=1){
    $query = 'select * from datetests where id = '.$id.';';
    $result = mysqli_query($con, $query);
    $result = mysqli_fetch_assoc($result);
    return $result;
}

输出(在我运行代码时)是:

2021-09-23 09:54:06
2021-09-23 09:54:06

1632383646
1632390846
____________
-7200

请注意,当格式化时,它们是相同的,但如果不是,它们会有7200个单位的差异。。。

附言: 在数据库中,我使用“DATETIME”类型来存储UTC_时间。 我使用以下函数获取每种语言的UTC时间:

gmdate(time()) -> PHP

UTC_TIME() -> MySQL

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133892
文章 [ 1 ]  |  最新文章 3 年前
O. Jones
Reply   •   1 楼
O. Jones    4 年前

时区处理可能是xss的一大难题。

  • 1632383646是协调世界时07:54:06,欧洲中部时间09:54:06
  • 1632390846是09:54:06 UTC,11:54:06 CET

php的 time() 总是返回 UNIX timestamp

但是,php strtotime() 函数接受日期/时间字符串 2021-09-23 09:54:06 好像是在当地时间 并将其转换为UNIX时间戳。你的机器设置为CET(+02:00),所以 strtime() 减去两个小时得到时间戳,时间戳假定始终以UTC为单位。

在应用程序设计方面,使用MySQL进行所有时区处理可能是明智的。已经安排好了 remarkably well 为了那项任务。

  1. 始终使用时间戳数据类型。这样,所有存储的日期/时间值都将以UTC为单位。

  2. 如果你想全球化,让每个用户选择自己的时区偏好,用字符串 Europe/Amsterdam Asia/Kolkata . See this .

  3. 当您代表用户对数据库运行查询时,首先给出以下MySQL语句

    SET time_zone = ###user-preference-string###
    

  4. 运行数据库维护查询时,首先说

    SET time_zone = 'utc'
    

    您的输出将以UTC为单位。