关于php:如何将datetime属性转换为unix timestamp属性?

How to convert datetime attribute into unix timestamp attribute?

我想通过更改"添加日期"列的数据类型来升级数据库表。

1
`date_added` datetime DEFAULT NULL

1
`new_date_added` bigint(20) NOT NULL

date_added的日期时间值以"yyyy-mm-dd hh:mm:ss"格式存储。此数据库表的行数超过15000。执行此修改的最佳方法是什么?

注意:我尝试执行以下MySQL查询:

1
2
3
ALTER TABLE  `my_table` ADD  `new_date_added` bigint(20) NOT NULL AFTER  `date_added`;
UPDATE `my_table` SET new_date_added = UNIX_TIMESTAMP(  `date_added` );
ALTER TABLE  `my_table` DROP `date_added`;

上面的解决方案没有将日期时间值转换为正确的Unix时间戳。如果将修改后创建的Unix时间戳与其原始日期时间值进行比较,则会有19800秒的差异。


19800秒=5:30小时。您可能位于印度(格林威治时间+5:30)。

UNIX_TIMESTAMP()生成与GMT相关的时间戳,因此您的值可能是正确的。

要返回正确的值,可以使用php的date()并设置正确的时区。

但是,首先要确保您有一个非常好的理由远离日期时间。它通常是高级格式,允许在MySQL中进行各种优化操作,并且不存在32位时间戳所存在的2038年问题。


我找到了解决我问题的办法。下面是给我正确时间戳的最终工作代码:

1
2
3
4
SET time_zone ="+00:00";
ALTER TABLE  `my_table` ADD  `new_date_added` bigint(20) NOT NULL AFTER  `date_added`;
UPDATE `my_table` SET new_date_added = UNIX_TIMESTAMP(  `date_added` );
ALTER TABLE  `my_table` DROP `date_added`;

@ela buwa:我编写了完全相同的代码,它给了我一个错误的时间戳值(由于时间戳值自动调整/移位)

@我的问题是关于mysql的unix_timestamp()给了我意想不到的值。使用php的date()函数不会影响mysql的时区设置。这就是为什么我使用SET time_zone ="+00:00";来配置mysql的时区。不过,谢谢你花时间回答我的问题。

感谢大家的努力和宝贵的时间。


我会用strtotime。它表示1970-01-01 00:00:00以来经过的秒数

1
2
3
4
5
6
7
8
9
<?php
echo(strtotime("now") ."");
echo(strtotime("3 October 2005") ."");
echo(strtotime("+5 hours") ."");
echo(strtotime("+1 week") ."");
echo(strtotime("+1 week 3 days 7 hours 5 seconds") ."");
echo(strtotime("next Monday") ."");
echo(strtotime("last Sunday"));
?>

如果要在MySQL中使用它,请使用update table_name set timefield=unix_timestamp(timefield);不过我还没有测试过。您可能需要检查这里的mysql文档。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html