我们什么时候选择DateTime而不是Timestamp

art*_*gis 6 php mysql sql datetime unix-timestamp

由于我将大部分时间花在php和mysql或pgsql上,我将使用DateTime作为日期API的通用词.在PHP中没有"Date","Time","DateTime"和"DateTimeOffset"

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

我看到这个主题提供了每种技术的优点的简单描述.

但它并没有真正回答这个问题.在PHP中的DateTime对象和我的数据库中的其他2个字节中抛出2个字节真的是一个损失,因为它允许我使用DATE_INTERVALAPI(在php中DateInterval)和IntlDateFormatter.

此外,这篇文章说unix_timestamp是从1970年开始保留的.但它不符合逻辑,有些测试证明了这一点:

echo date('d/m/Y',time(-1));
Run Code Online (Sandbox Code Playgroud)

回声'31/12/1969'!这是合乎逻辑的.32位无符号整数从0到0 4 294 967 295并且在68年内只有近2亿十亿秒,所以int被签名并且"负时间戳"必须存在!

另一个认为这对我来说非常重要,这让我每次选择DateTime都是为了处理日期,而不是整数.DateTime是一个日期,时间戳不是!我发现时间戳的唯一意义是我想要时间标记文件名的时间,因为在那个cas时间戳时间戳...

然而,仍然是一个问题:时区处理.由于MySQL和其他人在将日期存储为DateTime时不处理时区,目前,我使用TimeZone集成作为"过滤出逃出"的转义部分

$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'));
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?存储一个简单的时间戳然后获得当地时间不是更好吗?


所以,这里是一个问题的总结:

  • 更简单地使用API​​(仅显示)会导致DateTime的2个字节丢失吗?
  • 是时候放弃unix_timestamp了吗?
  • 存储一个简单的时间戳然后获得当地时间不是更好吗?

Rud*_*ser 4

正如评论中所说,我认为这主要取决于个人喜好。在我看来,使用 Unix 时间戳和“遗留”非 OOP 接口并不是当今世界的正确方法,例如,我们不会(读:不应该)INT在如果我们的数据库以 Unix 时间戳格式存储日期,我们应该使用数据库的本机类型,通常是 aDATE或类型,在标准转换时它几乎本机地DATETIME与 PHP 的对象(和其他语言)合作。DateTime

详细说明一下我所说的标准转换的含义:当您使用 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在再次将其拉出时使用。