由于我大部分时间都在使用 php 和 mysql 或 pgsql,因此我将使用 DateTime 作为日期 API 的通用词。在 php 中没有“日期”、“时间”、“日期时间”和“日期时间偏移”
随着我开发 Web 应用程序越来越精细,我大部分时间都使用 DateTime,但有时我想知道它是否真的是我想要的。例如,碰巧我只想显示今天的日期(例如,当我想存储论坛或博客文章时),没有计算,没有过滤器提供,没有迭代发生......那我为什么要使用\DateTime
超过date()
功能?
我看到这个主题提供了对每种技术的优点的一些简单描述。
但它并没有真正回答这个问题。在 PHP 中的 DateTime 对象中再抛出 2 个字节并在我的数据库中抛出另外 2 个字节真的是一种损失,因为它允许我使用DATE_INTERVAL
API(在 php 中它是DateInterval
)和 IntlDateFormatter。
此外,这篇文章说 unix_timestamp 是从 1970 年开始保留的。但这不合逻辑,一些测试证明了这一点:
echo date('d/m/Y',time(-1));
呼应“1969 年 12 月 31 日”!这是合乎逻辑的。一个 32 位的 unsigned 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 时,多 2 个字节的 DateTime 是否会丢失(仅显示)
- 是时候放弃 unix_timestamp 了吗?
- 存储一个简单的时间戳然后获取良好的本地时间不是更好吗?