由于我大部分时间都在使用php、mysql或pgsql,所以我会使用DateTime作为通用的日期API。在php中没有“Date”、“Time”、“DateTime”和“DateTimeOffset”。
随着我开发的web应用程序变得越来越复杂,我大部分时间都在使用DateTime,但有时我会想它是否真的是我想要的。
例如,当我想要存储论坛或博客文章时,有时只是想显示今天的日期,没有计算、过滤或迭代要执行...那么为什么我要使用\DateTime
而不是date()
函数呢?
我看到了这个话题,它提供了一些各种技术优劣的简单描述。
但它并没有真正回答这个问题。在PHP中,如果我可以使用DATE_INTERVAL
API(在php中是DateInterval
)和IntlDateFormatter,将2个字节多存储在DateTime对象中和数据库中是否真的会有损失呢?
此外,该帖子说unix_timestamp从1970年开始保留。但这并不合乎逻辑,一些测试也证明了这一点:
echo date('d/m/Y',time(-1));
回声'31/12/1969'!这是合理的。32位无符号整数从0到4 294 967 295,68年中只有近20亿秒,因此整数为有符号的,并且“负时间戳”必须存在!
对我来说真正重要的另一件事情是,我希望处理日期,而不是整数。DateTime是一个日期,时间戳不是!我发现时间戳唯一有意义的地方是当我想要标记文件名的时间时,因为在那种情况下时间戳就是时间戳...
然而,仍然存在一个问题:时区处理。 由于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'));
这是正确的方式吗?将一个简单的时间戳存储起来,然后获取良好的本地时间不是更好吗?
所以这里是问题的总结:
- 在API的真正简单使用中(仅用于显示),DateTime的两个字节会有损失吗?
- 是时候放弃unix_timestamp了吗?
- 将一个简单的时间戳存储起来,然后获取好的本地时间不是更好吗?
date()
函数只能工作到2038年。在那一年,date()
函数可能会被弃用;-) - GlavićDateTime
可以通过更简单和基于OOP的接口完成所有操作时,时间戳就不再那么有用了。 - Rudi Visser