3

我正在尝试编写一些 php 来确定给定工作日下一次出现的日期(Ymd 格式)。

date('Y-m-d', strtotime('next monday'));

正在返回

2011-08-29

代替

2011-08-22

在我的服务器上。不知道为什么。我的服务器是亚马逊美国东海岸数据中心的一个 EC2 实例,目前是 2011-08-21 9:40:00。

编辑 1date('Y-m-d', strtotime('next sunday'));返回2011-08-28而不是今天。我在http://writecodeonline.com/php/上试用了这段代码……开始认为测试仪不准确。

4

4 回答 4

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
于 2011-08-22T01:48:29.207 回答
0

您使用的是哪个版本的 PHP?在某些版本的 PHPstrtotime中确实存在错误行为。

strtotime我在手册页中发现:

5.0.2 在 PHP 5 到 5.0.2 中,“现在”和其他相对时间从今天的午夜开始计算错误。这与从当前时间正确计算的其他版本不同。

开始允许5.0.0微秒,但它们被忽略。

4.4.0 在 4.4.0 之前的 PHP 版本中,“next”被错误地计算为 +2。一个典型的解决方案是使用“+1”。

您描述的行为表明您的版本介于5.05.0.2之间。

我建议你检查一下今天和计算出的“下周一”之间的差异是否大于 7 天。如果是,减去 7 天,你就有了实际日期。

尝试使用该代码:

$days = ((strtotime('next monday') - time()) / 60 / 60 / 24);
if ($days >= 8) {
  $days -= 7;
}

我知道有date_diff函数,但是如果你的 PHP 版本像我想的那样低,它对你不可用(抱歉,只有 5.3.0 和更高版本)。

于 2011-08-22T01:46:07.360 回答
0

我认为这是预期的行为,因为星期一还没有过去,strtotime 将其视为下星期一。

于 2011-08-22T01:47:33.520 回答
0

“下一个”与工作日一起使用时,通常表示下一个最接近的日期之后的第一个。例如,如果今天是 21 日星期日,那么“下一个”星期一不是明天 22 日而是下一个星期一 29 日。

我知道这不一定是直观的,也不是普遍认可的,但我相信这就是strtotime()解释“下一步”的方式。

编辑:我已经通过自己的测试确认我是不正确的,并且“下一个”应该返回即将到来的第一个工作日(在我上面的示例中为 22 日)。我将把这个答案留在这里,因为它和下面的评论可能对其他人有帮助。

于 2011-08-22T03:22:01.287 回答