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


94

我在具有timestamp数据类型的MySQL表中有一个字段。我正在将数据保存到该表中。但是,当我将时间戳(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
您在说什么时间戳?你在哪里得到它?
您的常识

1
您可以在这里粘贴表格结构吗?

Answers:


160

这样通过

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

7
但是您在db中获得的值显示列类型为datetime,如果您要更改它,timestamp然后将列类型更改为varchar(15)
jimy 2011年

2
然后将其放在INT字段上。无论如何,时间戳只是日期的表示,反之亦然。您可以使用jimy告诉您的功能将时间戳转换为日期,或者使用strtotime。编辑:顺便说一句,时间戳仅涵盖所有可能的日期范围(我认为是1970-01-01至xx-xx-2032)
CarlosCampderrós2011年

4
那么timestamp数据类型的用途是什么?s_time字段具有时间戳记数据类型。我不能将1299762201428保存到该字段吗?
gautamlakum 2011年

@ lakum4stackof:对于timestamp数据类型,请参阅dev.mysql.com/doc/refman/5.0/en/timestamp.html的细节。
RollingBoy 2011年

1
@ lakum4stackof-时间戳的用途是您确实保存了时间戳,但是它仅显示为日期。在内部(与所有数据类型一样)将其存储为有符号整数。如果您还想将该时间戳记格式化为整数,则建议您仅使用INT字段。时间戳列的使用是日期操作(添加间隔等)。
Michael JV

52

嘿,使用此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')
尤里

5
类型安全性:FROM_UNIXTIME产生本地mysql日期类型,而php date()返回字符串。
理查德·图恩

5
最好是因为Web服务器(PHP)和MySQL可能位于不同的位置。因此,date('Ymd H:i:s','1299762201428')将设置Web服务器的时区。将不同的Web服务器放置在不同的区域中时,您的数据将不一致。另外,在代码中,您必须将应用程序时区强制为MySQL的时区。date_timezone_set
Ostico '17


15

需要澄清的一些事情:

  • MySQL时间戳字段类型不存储unix时间戳,而是存储日期时间类型的值。
  • UNIX时间戳是一个常规int类型的数字。
  • 您正在谈论的时间戳不是常规的unix时间戳,而是以毫秒为单位的时间戳。

因此正确的答案是

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


2

我猜测您要在其中保存值的字段不是 datetime字段,但对于timestamps似乎相同。如果是这样,mysql期望格式为Year-month-day Hour:minute:second。为了保存时间戳,您将必须使用类似以下的查询将字段转换为数字

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

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



1

使用FROM_UNIXTIME()

注意:1299762201428看起来更像是毫秒时间戳(例如JavaScript中的Date()* 1),您可能必须将其除以1000。


1

检查表中的字段类型只是将时间戳记值保存为数据类型,如 bigint等。

datetime输入



0

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


0

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

要从Unix时间戳转换,可以使用MySQL函数FROM_UNIXTIME(1299762201428)。要转换回来,您可以使用UNIX_TIMESTAMPSELECT 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

@Udo G:您是正确的,但datetime出于各种原因,我还是更喜欢。您认为最大的弊端是什么?
Znarkus 2011年

最大的优点是timestamp:它更好地匹配了PHP时间戳,因为它不受服务器和客户端时区设置的影响,而datetime更改显示的值取决于MySQL客户端的时区(当然,这取决于您的项目,一个更好)。最大的缺点是timestamp:它不支持NULL值,并且(我不知道他们在编写此代码时会抽烟)TIMESTAMP NOT NULL字段变成了TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP。就我而言,由于TZ原因,我需要使用TIMESTAMP
Udo G

0

更好的是使用数据类型varchar(15)


3
以字符串形式保存数字通常不是一个好习惯,因为字符串比较起来较慢且难以执行计算。
RollingBoy 2011年

我的投票投给了unsigned int,但让我们顺其自然。为什么用varchar而不是char?这是一个固定长度的条目-微优化,但仍然...
BradChesney79


-1

如果我知道数据库是MySQL,则将使用NOW()函数,如下所示:

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

这将仅存储当前时间戳,而不严格存储OP的要求。
charliefortune
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.