PHP的DateTime类有两个方法add()和sub()来添加或减去DateTime对象的时间跨度。这对我来说非常熟悉,在.NET中我可以做同样的事情。但是一旦我尝试了它,它就会做出非常奇怪的事情。我发现在PHP中,这些方法将修改对象本身。这没有记录,返回值类型另有说明。好的,所以在某些情况下我需要三行代码而不是一行代码,再加上一个额外的局部变量。但是,PHP5的参考模型副本也开始发挥作用。仅仅复制对象是不够的,您需要显式克隆它以便不会意外地修改原始实例。所以这是C#代码:
DateTime today = DateTime.Today;
...
if (date < today.Add(TimeSpan.FromDays(7)) ...
这是PHP等价物:
$today = new DateTime('today');
...
$then = clone $today;
$then->add(new DateInterval('P7D'));
if ($date < $then) ...
(我保留今天的副本,以便在方法运行时间内同时进行所有计算。我经常看到,在那个时间内,秒或更大的时间单位会发生变化......)
这是用PHP吗?如果没有更好的解决方案,我需要为它编写一个包装类!或者我将继续使用好的'time()函数,并使用DateTime来更轻松地解析我从数据库中获得的ISO日期。
$today = time() % 86400;
...
if ($date < $today + 7 * 86400) ...
这些例子中没有考虑时区。
更新:我刚刚发现我可以使用strtotime()函数来解析这些日期。那么,如果它使用起来那么复杂,那么PHP中的DateTime类有什么用呢?
更新^ 2:我注意到我的$ today = ......上面的东西是垃圾。那么,请想象一下正确的方法来获得'今天'而不是......
答案 0 :(得分:2)
看起来您肯定必须克隆该对象。似乎没有办法以任何其他方式创建DateTime对象的副本。
据我所知,你可以保存一行:
$today = new DateTime('today');
...
$then = clone $today;
if ($then->add(new DateInterval('P7D')) < $then) ...
我同意这不完美。但是,坚持使用DateTime
- 如果需要,写一个帮助类。 方式优于旧日期函数:它没有2038年的错误,它使得处理时区变得更加容易。