社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

Soulss • 3 年前 • 1245 次点击  

我正在尝试建立一个登录系统,为了重置密码或确认帐户,我有一个带有“过期日期”的列,为了让过期在任何地方都有效,我将存储在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
 
1245 次点击  
文章 [ 1 ]  |  最新文章 3 年前
O. Jones
Reply   •   1 楼
O. Jones    3 年前

时区处理可能是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为单位。