【问题标题】:PHP Get the year of most recent occurrance of specific datePHP 获取最近出现的特定日期的年份
【发布时间】:2013-08-26 05:56:43
【问题描述】:

我正在编写一个脚本,该脚本将确定特定日历日期最近发生的时间。

这篇帖子Get the year of a specified month in previous 12 months? 是我当前测试版的基础。它是针对每月结果而不是特定日期编写的。

<?php
if (empty($_GET['m'])) {
    $m = "October";
} else {
    $m = htmlspecialchars($_GET['m']);
}

if (empty($_GET['d'])) {
    $d = "1";
} else {
    $d = htmlspecialchars($_GET['d']);
}

date_default_timezone_set('America/Los_Angeles');

$m = date('m', strtotime($m));

$c = (mktime(0,0,0,$m,$d) < time())
    ? mktime(0,0,0,$m,$d)
    : mktime(0,0,0,$m,$d,date("Y") -1);

$from = date('F jS', $c) . " last occurred in " . date('Y', $c) . ".";

echo $from;
?>

默认值,10 月 1 日的结果是: “10 月 1 日最后一次发生在 2012 年。”

6 月 11 日,作为一个随机示例: “上次 6 月 11 日发生在 2013 年。”

所有日期结果均为 TRUE,除了 2 月 29 日的结果: “上一次 3 月 1 日发生在 2013 年。” 显然,这是一个错误的陈述,因为期望的结果是: “2 月 29 日最后一次发生在 2012 年。”

我有点卡住了,添加真正的闰年结果的最佳方法是什么?

【问题讨论】:

    标签: php date strtotime


    【解决方案1】:

    这是计算上一个真实年份。替换为以下代码。

    <?php
    if (empty($_GET['m'])) {
        $m = "October";
        } else {
        $m = htmlspecialchars($_GET['m']);
    }
    
    if (empty($_GET['d'])) {
        $d = "1";
        } else {
        $d = htmlspecialchars($_GET['d']);
    }
    
    date_default_timezone_set('America/Los_Angeles');
    
    $y = date('Y');
    if($m == "February" && $d == "29") $y = $y - ($y % 4);
    $m = date('m', strtotime($m));
    
    $c = (mktime(0,0,0,$m,$d) < time()) ? mktime(0,0,0,$m,$d,$y) : mktime(0,0,0,$m,$d,$y);
    
    $from = date('F jS', $c) . " last occurred in " . $y . ".";
    
    echo $from;
    ?>
    

    结果

    For 2013: Result 2012
    For 2012: Result 2012
    For 2011: Result 2008
    For 2010: Result 2008
    

    【讨论】:

    • 谢谢。但是,这会将所有以前的日期都放在去年,包括昨天。 2 月 29 日也变成了 3 月 1 日。我们还需要做什么吗?
    • 所以在你得到一天之前再次设置最后的年份。如果你真的设置年份,你会得到正确的结果。
    • 不知道哪里出了问题,但现在所有结果都是“12 月 1 日最后一次发生在 2013 年”。但是,我确实遵循您的逻辑,即使用真实年份而不是操纵值以获得所需结果。你能检查一下吗?
    【解决方案2】:
    $month = 9;
    $day = 1;
    
    $timestamp = mktime(0, 0, 0, $month, $day);
    if ($timestamp > time()) {
    $timestamp = mktime(0, 0, 0, $month, $day, date('Y') - 1);
    }
    covert timestamp to your desire format.
    

    【讨论】:

    • 这是进步。不幸的是,它仍然强制将 2 月 29 日变为 3 月 1 日,然后将最后一次计算为 2013 年。谢谢。
    猜你喜欢
    • 2017-01-19
    • 2013-06-24
    • 2014-06-26
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多