【问题标题】:PHP: How to get previous Sunday of a specific date in the past..?PHP:如何获取过去某个特定日期的上周日..?
【发布时间】:2011-04-14 03:46:30
【问题描述】:

我正在从数据库中检索具有关联日期的条目。

我希望能够获取相对于该特定日期的上一个星期日和下一个星期六来填充 jQuery 日期选择器。

我知道如何处理实际时间/日期:

strtotime('last Sunday')

但我不知道如何在现在以外的日期这样做......

谢谢。

【问题讨论】:

    标签: php date datepicker


    【解决方案1】:

    使用strtotime 的第二个参数指定计算“上周日”的日期和其他相对日期:

    strtotime('last Sunday', strtotime('09/01/2010'));
    

    http://us2.php.net/strtotime

    例子:

    echo date('m/d/Y', strtotime('last Sunday', strtotime('09/01/2010')));
    

    输出:

    08/29/2010
    

    【讨论】:

    • 不需要调用strtotime两次,可以像echo date('m/d/Y', strtotime("last sunday 09/01/2010"));一样完成
    【解决方案2】:

    您也可以使用 datetime 类来执行此操作。下面的代码可以工作:

    $date = new DateTime('09/01/2010'); $date->modify('上周日'); echo $date->format('d/m/Y');
    Output: 29/08/2010
    

    看看http://ca2.php.net/manual/en/class.datetime.php。构造函数有两个可选参数,第一个是对象的日期字符串(默认为现在),第二个是 DateTimeZone 对象(默认为 PHP.ini 中设置的时区)。然后 modify 方法使用 strtotime() 支持的相同表达式更改日期,而 format 方法使用与 date() 相同的格式字符串格式化日期。基本上这与 pygorex1 的示例相同,但使用了面向对象的语法。

    【讨论】:

    • 请注意,这需要 PHP 5.3。
    • @alexn 这不是真的。从 PHP 5.2 开始可以使用 datetime 类。 PHP 5.3 中提供了一些额外的方法(我想到了 add 和 sub),但我在示例中使用的所有方法都在 PHP 5.2.x 中可用。
    • 有趣...我真的必须开始研究 OO。我知道保持最新是必须的,但是对于我拥有的项目的类型/规模来说,OO 似乎太多/不必要了......
    【解决方案3】:

    您可以使用工作日偏移量。在 PHP 中用于任意日期:

    <?php
    
    define('SEC_IN_DAY', (24*60*60));
    
    $d = strtotime('2013-04-15');
    // "w" is the day of the week. 0 for Sunday through 6 for Saturday
    $delta_sun = -date('w', $d);
    $delta_sat = $delta_sun + 6;
    
    echo 'The day ' . date('Y-m-d H:i:s', $d) . "\n";
    echo 'Last Sunday '. date('Y-m-d H:i:s', $d + $delta_sun * SEC_IN_DAY) . "\n";
    echo 'Next Saturday '. date('Y-m-d H:i:s', $d + $delta_sat * SEC_IN_DAY) . "\n";
    

    在 MySQL 中也是这样:

    SET @d := '2013-04-15';
    SET @delta_sun := -DATE_FORMAT(@d, '%w');
    SET @delta_sat := @delta_sun + 6;
    
    SELECT 'The day' AS `name`, DATE(@d) AS `date`
      UNION ALL
    SELECT 'Last Sunday' AS `name`, DATE_ADD(@d, INTERVAL @delta_sun DAY) AS `date`
      UNION ALL
    SELECT 'Next Saturday' AS `name`, DATE_ADD(@d, INTERVAL @delta_sat DAY) AS `date`
    

    【讨论】:

    • SEC_IN_DAY 常量可能有点毫无意义。 86400 在 PHP 中是一个非常常用和已知的数字,你可以直接使用它。
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多