一尘不染

我们何时选择DateTime over Timestamp

sql

当我将大部分时间用于php和mysql或pgsql时,我将使用DateTime作为date API的通用词。 在php中,没有“日期”,“时间”,“DateTime”和“ DateTimeOffset”

随着我越来越复杂地开发Web应用程序,我大部分时间都使用DateTime,但有时我想知道它是否真的是我想要的。例如,碰巧我只想显示今天的日期(例如,当我要存储论坛或博客文章时),没有计算,没有提供过滤器,没有迭代发生了。那么为什么我使用\DateTime超过date()功能?

我看到了这个主题,它提供了每种技术的优点的一些简单描述。

但这并不能真正回答问题。在PHP的DateTime对象中再扔2个字节,在数据库中另外2个字节,这真的是一种损失,因为它允许我使用DATE_INTERVALAPI(在php中是DateInterval)和IntlDateFormatter。

而且,这篇文章说unix_timestamp是从1970年开始保留的。但是它不合逻辑,一些测试证明了这一点:

echo date('d/m/Y',time(-1));

回声‘31 / 12/1969’!这是合乎逻辑的。一个32位无符号的int从0到4 294 967 295,在68年中只有将近20亿秒,因此int是带符号的,并且必须存在“负时间戳记”!

另一个认为对我来说真的很重要,并且让我每次都选择DateTime是因为我想处理日期,而不是整数。DateTime是日期,时间戳记不是!我发现要时间戳记的唯一感觉是我想给文件名加上时间标记的时间,因为在该cas时间戳记中
时间戳记…

但是,这仍然是一个问题:时区处理。由于MySQL和其他人在将日期存储为DateTime时无法处理时区,因此,现在,我将TimeZone集成用作“
filter in escape out”的转义部分。

$toStoreDate = new \DateTime($_POST['date'],new DateTimeZone('UTC'));
$dao->exec('INSERT INTO mytable(mydate) VALUES (\''.$toStoreDate->format('Y-m-d h:i:s').'\')');
$toDisplayDate =new \DateTime( $dao->query('SELECT mydate FROM mytable')
    ->fetch(DAO::FETCH_ASSOC)['mydate']);
$toDisplayDate->setTimeZone(new DateTimeZone('myLocal'));

这是正确的方法吗?存储一个简单的时间戳然后获取良好的本地时间会更好吗?


因此,这是问题的摘要:

  • 在真正简单地使用API​​(仅显示)后,DateTime的另外2个字节会丢失吗?
  • 现在是时候放弃unix_timestamp了吗?
  • 存储一个简单的时间戳然后获取良好的本地时间会更好吗?

阅读 144

收藏
2021-03-17

共1个答案

一尘不染

正如评论中所说,我认为这主要取决于个人喜好。在我眼中,在当今世界,使用Unix时间戳和“旧式”非OOP接口不是实现此目标的方法,例如,我们不(应:不应)使用以下INT类型的数据类型:我们的数据库以Unix
Timestamp格式存储日期,我们应该改为使用数据库的本机类型,通常是aDATEDATETIMEtype,它DateTime在进行标准转换时几乎与PHP的对象(和其他语言)配合使用。

详细说明一下标准转换的含义:当您使用MySQL并将值拉回PHP时,您将获得一个ISO格式的日期字符串,DateTime该类在其构造函数中对其进行解析,从而为您提供了立即可用的对象。相反,要使用Unix时间戳记路由,您将不得不使用strtotime
然后 date将其转换为您想要的本机格式。

我之前提到过有关我们的PHP系统和.NET系统之间的互操作的信息。尽管没有使用时间戳引起的特定问题,但这根本不是实际的解决方案,同样,我们使用的数据库返回的DateTime值可以直接通过管道发送。如果我们要将其转换为unix时间戳以在PHP内部使用,则我们还必须将其转换回去,以便发送响应或将响应发送到.NET应用程序(或者我应该只说API)
(在这种情况下)这是一个时间戳,最后将其转换。通过全面使用DateTime,可以减少进行任何转换的需求,并且整个开发过程变得更加容易。

最后,要添加到所有这些内容中,就像您在帖子中所提到的那样,您将使用闪亮的项目,例如DateInterval,更容易的时区划分,更容易的操作和更容易的格式化等,DateTime并且与犯罪相关的面向对象的伙伴一起使用。在我看来,这只是一个简单的开发过程。

我不相信,正如我最初说的那样,对此有一个“正确”的答案,只是更多基于您自己的编码风格的个人喜好,并且上面的注释反映了我的观点。

在真正简单地使用API​​(仅显示)后,DateTime的另外2个字节会丢失吗?

  • 我绝不相信。尤其是对于PHP脚本,无论如何它们通常运行时间都很短。

现在是时候放弃unix_timestamp了吗?

是的 :)

存储一个简单的时间戳然后获取良好的本地时间会更好吗?

请参阅上面有关数据库的注释,为此目的,使用Unix时间戳记并不是“本机”。您可以调用它->getTimezone并将其存储在数据库中,然后->setTimezone在再次将其拉回时使用。

2021-03-17