您建议使用datetime或timestamp字段吗?为什么(使用MySQL)?
我在服务器端使用PHP。
您建议使用datetime或timestamp字段吗?为什么(使用MySQL)?
我在服务器端使用PHP。
当前回答
2016+:我建议您将Mysql时区设置为UTC,并使用DATETIME:
任何最近的前端框架(Angular 1/2、react、Vue…)都可以轻松自动地将UTC日期时间转换为本地时间。
此外:
DATETIME现在可以自动设置为当前时间值。如何设置MySQL DATETIME列的默认值?与人们可能认为的相反,DATETIME比TIMESTAMP快,http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/TIMESTAMP仍然限于1970-2038
(除非您可能更改服务器的时区)
AngularJs示例
// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...
// font-end Output the localised time
{{item.my_datetime | date :'medium' }}
此处提供所有本地化时间格式:https://docs.angularjs.org/api/ng/filter/date
其他回答
我喜欢Unix时间戳,因为你可以转换成数字,只需担心数字。此外,您还可以添加/减去和获取持续时间等。然后将结果转换为任何格式的日期。这段代码找出文档的时间戳和当前时间之间经过了多少时间(以分钟为单位)。
$date = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now - $result) / 60);
$min = round($unix_diff_min);
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP | DATETIME |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes. | DATETIME requires 8 bytes. |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format. |
| TIMESTAMP supported range: ‘1970-01-01 00:00:01′ UTC to ‘2038-01-19 03:14:07′ UTC. | DATETIME supported range: ‘1000-01-01 00:00:00′ to ‘9999-12-31 23:59:59′ |
| TIMESTAMP during retrieval converted back to the current time zone. | DATETIME can not do this. |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose. | DATETIME is used mostly for user-data. |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
TIMESTAMP始终采用UTC格式(即自1970-01-01以来的秒数,采用UTC格式),MySQL服务器会自动将其转换为连接时区的日期/时间。从长远来看,TIMESTAMP是一条可行的道路,因为您知道您的时间数据将始终采用UTC格式。例如,如果您迁移到其他服务器或更改服务器上的时区设置,您就不会把日期搞砸。
注意:默认连接时区是服务器时区,但这可以(应该)在每个会话中更改(请参见SET time_zone=…)。
MySQL中的时间戳通常用于跟踪记录的更改,并且经常在每次更改记录时更新。如果要存储特定值,应使用datetime字段。
如果您希望在使用UNIX时间戳或本机MySQL日期时间字段之间做出选择,请使用本机datetime格式。您可以通过这种方式在MySQL中进行计算(“SELECT DATE_ADD(my_datetime,INTERVAL 1 DAY)”),如果您想用PHP对记录进行操作,那么在查询记录时,很容易将值的格式更改为UNIX时间戳(“SELECT UNIX_timestamp(my_datatime)”)。
我更喜欢使用时间戳,以便将所有内容保持在一个通用的原始格式中,并将数据格式化为PHP代码或SQL查询。在某些情况下,它可以在代码中方便地将所有内容保持在简单的秒数内。