我正在尝试编写一些php来确定给定工作日下一次出现的日期(Y-m-d格式)。
date('Y-m-d', strtotime('next monday'));
正在返回
2011-08-29
而不是
2011-08-22
在我的服务器上。不知道为什么。我的服务器是亚马逊美国东海岸数据中心的EC2实例,目前是2011-08-21 9:40:00。
编辑1
date('Y-m-d', strtotime('next sunday'));
也会返回2011-08-28
而不是今天。我在http://writecodeonline.com/php/上尝试了这段代码......开始认为测试人员不准确。
答案 0 :(得分:2)
仅仅因为您的服务器设置为某个时区并不一定意味着PHP将在同一时区上运行。它已于2011年8月22日星期一在欧洲,其中还包括UTC。如果你的PHP在这个时区上行动,“下周一” 将是8月29日。
您应该仔细检查PHP中的时区设置。您可以运行date_default_timezone_get()
来检查您的安装使用的设置,或者尝试强制您的PHP脚本使用您期望的date_default_timezone_set("America/New_York");
时区,看看您是否得到了您期望的结果。
我刚试过这个:
date_default_timezone_set("America/New York");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-22
date_default_timezone_set("UTC");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-29
答案 1 :(得分:0)
您使用的是哪个版本的PHP?在某些版本的PHP strtotime
中确实存在错误行为。
我在strtotime
手册页中找到了:
5.0.2 在PHP 5到5.0.2之间,“现在”和其他相对时间从今天的午夜错误地计算出来。这与从当前时间正确计算的其他版本不同。
5.0.0 开始允许微秒,但忽略它们。
4.4.0 在4.4.0之前的PHP版本中,“next”被错误地计算为+2。对此的典型解决方案是使用“+1”。
您描述的行为表明您的版本介于 5.0 和 5.0.2 之间。
我建议您检查今天和计算的“下一个星期一”之间的差异是否高于7天。如果是,则减去7天,并且您有实际日期。
尝试使用该代码:
$days = ((strtotime('next monday') - time()) / 60 / 60 / 24);
if ($days >= 8) {
$days -= 7;
}
我知道有date_diff功能,但如果您的PHP版本太低,我认为它不适合您(抱歉,只有5.3.0及更高版本)。
答案 2 :(得分:0)
我认为这是预期的行为,因为周一没有通过strtotime将其视为下周一。
答案 3 :(得分:0)
“下一步”,与工作日一起使用时,通常表示下一个最接近的一个之后的第一个。例如,如果今天是21日星期日,那么“下一个”星期一不是明天22日,而是下周一29日。
我知道这不一定是直观的,也不是普遍认可的,但我相信这就是strtotime()
解释“下一步”的方式。