【问题标题】:php function returns falsephp函数返回false
【发布时间】:2012-01-15 18:26:29
【问题描述】:

以下 PHP 函数返回一个月的第 n 个工作日,例如2012 年 1 月的第三个星期三,格式为 18-1-2012:

<?php
  function giveNthDay($month, $year, $no, $day) {
     $counter = 0;
     for($i=1;$i<=31;$i++) { //Schleife für 31 Tage
         if(!checkdate($month, $i, $year)) { //wenn datum nicht existiert (bspw. 30. februar) zu nächstem schleifendurchlauf springen
             continue;
         } else {
             if(date('l', strtotime($i.'-'.$month.'-'.$year))==$day) { //wenn generiertes Datum gleicher Wochentag wie gesuchter Tag $day
                 $counter++; //dann $counter um eins erhöhen
                 if($counter==$no) { //falls $counter==$no, also falls bspw. DRITTER ($no==$counter==3) Mittwoch gefunden, Datum zurückgeben
                     return     $i.'-'.$month.'-'.$year;
                 }
             }
         }
     }
     return false; //existiert nicht, bspw. fünfter Sonntag gibt es nicht in jedem Monat
  }
?>

如果日期不存在(例如 2012 年 1 月的第 5 个星期五),则返回 false。

这适用于以下示例:

giveNthDay(1, 2012, 3, "Wednesday");
giveNthDay(1, 2020, 3, "Wednesday");
giveNthDay(1, 2031, 3, "Wednesday");

但来自

giveNthDay(1, 2038, 3, "Wednesday");

打开,即使每年一月有超过 3 个星期三,它也会返回 false!

我试图找出这种奇怪行为的原因,但我无法弄清楚。谁能帮帮我?

【问题讨论】:

  • 只执行 continue 的 if 块真的很恶心。你听说过“else if”吗?或者getdate() 函数?

标签: php


【解决方案1】:

2038 超出范围,最大日期为 2037(在 32 位架构上)。 time() 是一个 unix 时间戳(从 1970-1-1 00:00:00 开始)。

【讨论】:

  • DateTime 类应该用于 2038 年之后的日期。
  • date('c', pow(2,31)); &gt; 2038-01-19T04:14:08+01:00,但是我的系统是 64 位的,所以我可以变得更大:echo strftime('%c', pow(2,62)); Tue Jun 19 08:45:04 109626219 我猜你的下一个服务器将能够处理 2038 年。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多