使用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 日期类型,而 php 的 date()
返回一个字符串。
这样更好,因为 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表中保存时间戳的主要内容,如果未能解决你的问题,请参考以下文章