Php 我们什么时候选择日期时间而不是时间戳
由于我大部分时间都在使用php和mysql或pgsql,因此我将使用DateTime作为DateAPI的通用词。在php中没有“日期”、“时间”、“日期时间”和“日期时间偏移” 随着我开发web应用程序越来越精细,我大部分时间都使用DateTime,但有时我想知道它是否真的是我想要的。 例如,我只想显示今天的日期(例如,当我想存储论坛或博客帖子时),没有计算,没有提供过滤器,没有迭代。。。那么为什么我要在Php 我们什么时候选择日期时间而不是时间戳,php,mysql,sql,datetime,unix-timestamp,Php,Mysql,Sql,Datetime,Unix Timestamp,由于我大部分时间都在使用php和mysql或pgsql,因此我将使用DateTime作为DateAPI的通用词。在php中没有“日期”、“时间”、“日期时间”和“日期时间偏移” 随着我开发web应用程序越来越精细,我大部分时间都使用DateTime,但有时我想知道它是否真的是我想要的。 例如,我只想显示今天的日期(例如,当我想存储论坛或博客帖子时),没有计算,没有提供过滤器,没有迭代。。。那么为什么我要在date()函数上使用\DateTime 我看到它简单地描述了每种技术的优点 但这并不能真正
date()
函数上使用\DateTime
我看到它简单地描述了每种技术的优点
但这并不能真正回答这个问题。在PHP中,在DateTime对象中再抛出2个字节,在我的数据库中再抛出2个字节,因为它允许我使用DATE\u INTERVAL
API(在PHP中,它是DateInterval
)和IntlDateFormatter,这真的是一种损失吗
此外,这篇文章说unix_时间戳是从1970年保留的。但这不符合逻辑,一些测试证明了这一点:
echo date('d/m/Y',time(-1));
回音'31/12/1969'!这是合乎逻辑的。32位无符号整数从0变为4294967295,68年内只有近20亿秒,因此整数是有符号的,“负时间戳”必须存在
另一个对我来说非常重要的想法是,我每次都选择DateTime,因为我想处理日期,而不是整数。DateTime是日期,时间戳不是!我发现时间戳的唯一意义是我想要对文件名进行时间标记的时间,因为在cas中时间戳是时间戳
然而,仍然存在一个问题:时区处理。
由于MySQL和其他数据库在将日期存储为DateTime时不处理时区,目前,我使用时区集成作为“filter in escape out”的转义部分
这条路对吗?存储一个简单的时间戳,然后获取好的本地时间不是更好吗
因此,以下是问题的摘要:
- 在真正简单地使用API(仅显示)时,多2个字节的DateTime是一种损失吗
- 是时候放弃unix_时间戳了吗
- 存储一个简单的时间戳,然后获取好的本地时间不是更好吗
时间戳
而不是日期时间
,因为我相信处理整数
值比处理日期时间
值更具成本效益(测量CPU的处理时间)
当我在二进制机器上拥有数字
,而不是拥有字符串
或对象
时,我感到非常舒服
人与机器的较量
<> > <强>可理解性<强>,我要说的是,当我为计算机编写程序时,我会认为我正在编写一个<代码>机器>代码>,但是如果在该层上的抽象可以帮助人类更好地理解它,当性能不是问题时,我们为什么不使用它呢
我不记得是谁说的,也不记得在哪里听到的,但有人说人们讨厌计算机,但他们应该讨厌程序员,我完全同意这一点。因此,作为一名人类,我仍然尊重这台机器,并将努力制作计算机更容易理解的程序。:)
更新:
为了更好地描述它,假设我们有一个处理“日期”的程序,每分钟处理10000次,对吗
// it LOOKS Better
$date = new DateTime();
$date->setDate(1986, 3, 24); // March 24, 1986
echo $date->format('Y-m-d');
// it WORKS Better
echo date("Y-m-d", mktime(0, 0, 0, 3, 24, 1986)); // March 24, 1986
假设我每周要看一个小时的代码,假设有10000人需要24/7/365处理,当然我不会处理,这是机器的任务
顺便说一下,我想再次指出,如果性能不是问题,那么为什么我们不让程序员更容易理解呢?如果我们需要最大限度地利用它,那么让程序员看看工作得更好的代码,而不是看起来更好的代码。
!:) 正如我在评论中所说的,我相信这主要是因为个人偏好。在我看来,在当今世界,使用Unix时间戳和“遗留”非OOP接口并不是实现这一点的方式,例如,我们不(读:不应该)在数据库中使用INT
数据类型以Unix时间戳格式存储日期,相反,我们应该使用数据库的本机类型,通常是DATE
或DATETIME
类型,当涉及到标准转换时,它与PHP的DATETIME
对象(和其他语言)几乎本机合作
详细阐述一下我所说的标准转换的含义:当您使用MySQL并将值拉回到PHP时,您会得到一个ISO格式的日期字符串,DateTime
类在其构造函数中解析该字符串,从而为您提供一个立即可用的对象。相反,要使用Unix时间戳路径,您必须使用strotime
,然后使用date
将其转换为您本机想要的任何格式
我之前提到过PHP系统和.NET系统之间的互操作。虽然使用时间戳不会导致任何具体问题,但这并不是实际的解决方案,同样,我们使用一个数据库,它返回一个可以直接发送的日期时间值。如果我们要将其转换为unix时间戳,以便在PHP内部使用,那么如果我们要发送响应,或者向.NET应用程序(或者在本例中我应该说是API)发送响应,那么我们还必须将其转换回来,这是一个时间戳,并在最后进行转换。通过全面使用DateTime
,它减少了任何转换的需要,并且整个开发过程更容易
最后要补充的是,正如你在文章中提到的,你得到了t
// it LOOKS Better
$date = new DateTime();
$date->setDate(1986, 3, 24); // March 24, 1986
echo $date->format('Y-m-d');
// it WORKS Better
echo date("Y-m-d", mktime(0, 0, 0, 3, 24, 1986)); // March 24, 1986