我应该在MySQl中使用UTC时间/日期的时间戳或文本字段

时间:2010-01-04 17:14:31

标签: php mysql datetime timestamp

我读了一个mysql时间戳只能保存一个值19700101000000到2037年的某个时间。我严重怀疑我的应用程序将在那时,我确定它不会知道人们会用什么时间戳的时间戳,一个文本字段?

下面是我当前如何使用datetime mysql字段插入mysql记录的示例,您可以看到我在下面的PHP中使用 now(),现在我正在重新编码我的网站和我将提供时区支持以向用户显示正确的时间,因此我需要将日期和时间保存为UTC时间戳。

<?PHP
$sql = "INSERT INTO online_users 
    (user_id,
    online_id,
    ip,
    datetime,
    location,
    gender) 
    values ('$cache->userid,$unid,$LOCALIP,NOW(),$location,$g)";
executeQuery($sql);
?>

根据我上面的代码和上面的信息,如何格式化此代码以将时间和日期插入UTC,我应该在MySQL中使用时间戳字段还是文本字段?我需要在经常显示时修改我的php中的时间,例如在某些帖子中我计算自mysql时间(2天4小时34秒前)以来经过的时间。我还需要花时间查询过去一周用户之类的东西来登录。我不是问如何做我刚发布的那些东西,以显示我将使用的时间,以防万一有助于确定我应该保存它的最佳方法。

6 个答案:

答案 0 :(得分:3)

存储日期时间的最佳列是DATETIME。它简化了代码和查询,因为您不必一直来回转换为整数时间戳,MySQL会为您处理所有日期比较逻辑。

您可以使用MySQL UTC_DATE()UTC_TIME()UTC_TIMESTAMP()函数代替NOW()来获取MySQL中的当前UTC时间戳。

答案 1 :(得分:2)

我一直将epoch / unix时间存储为数据库字段中的有符号整数。 MySQL有UNIX_TIMESTAMP()&amp; FROM_UNIXTIME()功能。我已经并将继续收到这方面的警告,但日期数学很容易,这种日期格式的应用程序语言支持几乎无处不在,我可以维护操作系统(例如航空公司日程安排信息),不管有关DST更正的政治突发奇想而不用担心系统/运行时更新。

一些网站甚至懒得进行日期转换,并允许客户端的JavaScript在当地时间进行投影。

您提及的时间增量(即最后一次视图之间的时间长度)可以轻松实现,因为您可以立即获得经过的秒数。

答案 2 :(得分:1)

我在这个问题/答案中尝试了所有提及但没有任何方法正常工作,最后我能够获得php timezones date_default_timezone_set()函数以正确使用我的日期和时间从mysql中存储的唯一方法是将它们存储为整数然后它完美。对我来说没有排序速度慢的问题,因为我按ID号而不是日期排序,但按日期排序,一旦我弄清楚它们之间有多少秒,我认为不会太难。

当我在mysql中使用整数字段时,我可以将UTC时间戳存储为1262658989.当您在mysql中使用时间戳或日期时间字段时,它会自动将其转换为此样式2003-04-14 00:00:00因此,由于某种原因,很难使用时区。

使用整数代替我可以使用以下代码在PHP中获取UTC时间戳:

gmdate('U', time())

答案 3 :(得分:0)

我会将时间戳字段用于日期,因为它将使排序/过滤速度比在文本字段上更快。在26年内,您可以与我们联系,了解您需要做些什么才能超越Y2K37。

- )

答案 4 :(得分:0)

如果您需要支持不同的时区,最明智的日期选择是TIMESTAMP列类型,即使它的范围最多只有2038-01-19 03:14:07。这仍然会让你花28年时间思考如何解决这个问题。

使用TIMESTAMP列类型的好处是所有日期都保存为UTC并根据请求转换为所需的时区。这样你就不用太担心时区了。但是,它并没有解决你所有的问题。

答案 5 :(得分:0)

您还可以使用ON UPDATE CURRENT_TIMESTAM P来更新行更新时的字段