使用php在mysql表中保存时间戳

Posted

技术标签:

【中文标题】使用php在mysql表中保存时间戳【英文标题】:Saving timestamp in mysql table using php 【发布时间】:2011-08-03 17:03:04 【问题描述】:

我在 mysql 表中有一个字段,其数据类型为 timestamp。我正在将数据保存到该表中。但是当我将时间戳 (1299762201428) 传递给记录时,它会自动将值 0000-00-00 00:00:00 保存到该表中。

如何将时间戳存储在 MySQL 表中?

这是我的INSERT 声明:

INSERT INTO table_name (id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES (1,5,9,'2',1299762201428,5,10,20,'1'),
       (2,5,9,'2',1299762201428,5,10,20,'1')

【问题讨论】:

什么时间戳你在说什么?你从哪里弄来的? 你可以在这里粘贴你的表结构吗? 【参考方案1】:

这样通过

date('Y-m-d H:i:s','1299762201428')

【讨论】:

但是你在db中得到的值显示列类型是datetime,如果你想把它改成timestamp然后把列类型改成varchar(15) 然后把它放在一个 INT 字段上。无论如何,时间戳只是日期的表示,反之亦然。您可以使用 jimy 告诉您的函数将时间戳转换为日期,而使用 strtotime 则相反。编辑:顺便说一句,时间戳仅涵盖所有可能日期的范围(我认为是 1970-01-01 到 xx-xx-2032) 那么时间戳数据类型有什么用呢? s_time 字段具有时间戳数据类型。我不能将 1299762201428 保存到该字段吗? @lakum4stackof:时间戳数据类型请参考dev.mysql.com/doc/refman/5.0/en/timestamp.html了解详情。 @lakum4stackof - 使用时间戳是您确实保存了时间戳,但它仅显示为日期。在内部(与所有数据类型一样)它存储为有符号整数。如果您还想将该时间戳格式化为整数,我建议您只使用 INT 字段。时间戳列的使用是日期操作(添加间隔等)。【参考方案2】:

如果时间戳是当前时间,可以使用mysql的NOW()函数

【讨论】:

【参考方案3】:

数据类型“bigint unsigned”可能适合此要求。

【讨论】:

【参考方案4】:

我猜测您尝试保存值的字段是日期时间字段它不是,但时间戳似乎也是如此。如果是这样,mysql 期望格式为年-月-日时:分:秒。为了保存时间戳,您必须使用类似的查询将字段转换为数字

alter table <table_name> change <field> <field> bigint unsigned

如果您使用的是当前时间,您可以使用 now() 或 current_timestamp。

【讨论】:

【参考方案5】:

您好,请使用 FROM_UNIXTIME() 函数。

像这样:

INSERT INTO table_name
(id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES
(1,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1'), 
(2,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1')

【讨论】:

为什么这比date('Y-m-d H:i:s','1299762201428')好? 类型安全:FROM_UNIXTIME 产生一个原生 mysql 日期类型,而 phpdate() 返回一个字符串。 这样更好,因为 Web 服务器 ( PHP ) 和 MySQL 可以在不同的地方。因此, date('Y-m-d H:i:s','1299762201428') 将设置 Web 服务器的时区。将不同的 Web 服务器放置在不同的区域中,您将获得不一致的数据。或者,在您的代码中,您必须将应用程序时区强制为 MySQL 的时区。 date_timezone_set【参考方案6】:

使用FROM_UNIXTIME()

注意:1299762201428 看起来更像是一个毫秒时间戳(如 javascript 中的 Date()*1),您可能需要将其除以 1000。

【讨论】:

【参考方案7】:

使用datetime 字段类型。它具有许多优点,例如人类可读性(没有人读取时间戳)和MySQL functions。

要从 unix 时间戳转换,您可以使用 MySQL 函数 FROM_UNIXTIME(1299762201428)。要转换回来,您可以使用UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name

当然,如果你不喜欢 MySQL 功能,你可以随时使用 PHP:'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp)

【讨论】:

timestamp 字段类型 也是人类可读的(在控制台中使用 SELECT 时)。它们非常不同,都有各自的缺点/优点。主要区别在于处理时区的方式。 @Udo G:你说得对,但出于各种原因,我还是更喜欢datetime。您认为最大的缺点/优点是什么? timestamp 的最大优势:它更好地匹配 PHP 时间戳,因为它不受服务器和客户端的时区设置的影响,而 datetime 改变了它显示 值取决于你的 MySQL 客户端的时区(当然这取决于你的项目,哪个更好)。 timestamp 的最大缺点:它不支持 NULL 值并且(我不知道他们在编程时做了什么)TIMESTAMP NOT NULL 字段变成了TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP。就我而言,不幸的是,出于 TZ 的原因,我需要使用TIMESTAMP【参考方案8】:

最好使用数据类型varchar(15)

【讨论】:

以字符串的形式保存数字通常不是一个好习惯,因为字符串比较慢并且更难计算。 我的票投给了 unsigned int-- 但让我们从兔子洞里走下去。为什么是 varchar 而不是 char?它是一个固定长度的条目——微优化,但仍然......【参考方案9】:

检查表中的字段类型,只需将时间戳值保存在 bigint 等数据类型中。

不是datetime 类型

【讨论】:

【参考方案10】:

需要澄清的一些事情:

MySQL 时间戳字段类型不存储 unix 时间戳,而是存储日期时间类型的值。 UNIX 时间戳是一个常规 int 类型的数字。 您所说的时间戳不是普通的unix时间戳,而是以毫秒为单位的时间戳。

所以正确答案是

$timestamp = '1299762201428';
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3));

【讨论】:

【参考方案11】:

应该这样做:

  $time = new DateTime; 

【讨论】:

【参考方案12】:

您也可以在查询中使用now(),即:

insert into table (time) values(now());

它将使用当前时间戳。

【讨论】:

【参考方案13】:
$created_date = date("Y-m-d H:i:s");
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
$result = mysql_query($sql);

【讨论】:

【参考方案14】:

如果我知道数据库是 MySQL,我会像这样使用 NOW() 函数:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 

【讨论】:

这将仅存储当前时间戳,而不是严格意义上的 OP 要求的。【参考方案15】:

你可以这样做:$date = \gmdate(\DATE_ISO8601);

【讨论】:

以上是关于使用php在mysql表中保存时间戳的主要内容,如果未能解决你的问题,请参考以下文章

急!将mysql中日期转化为时间戳

将mysql时间戳转换为实际日期和时间?

PHP 如何在 unix 中获取服务器的时间戳? [复制]

CassandraIO 无法保存时间戳

使用 MySQL 的 TIMESTAMP 与直接存储时间戳

具有毫秒精度的时间戳:如何将它们保存在 MySQL 中