5

我有一个系统,可以将截至当前日期的财政年度与前一年的同一日期范围进行比较。您可以调整要查看的年份和月份,并且它始终将相同的日期范围与前一年进行比较。我设置了它,所以如果今天是闰日,它与去年的 28 日相比,如果去年是闰年,今天是 2 月 28 日,它与去年的 29 日相比。如果您查看当前月份以外的月份,则它会显示到该月的最后一天,否则会显示到当前日期。

好的,现在工作正常,但现在我的雇主不希望它达到当前日期,他们希望它达到昨天的日期。我该怎么做呢,我主要关心的是如果今天是本月的第一天,或者今天是财政年度的第一天怎么办。

这是我现在拥有的代码:

function create_YTD_XML()
{
    global $month;
    global $year;

    $last_year = $year - 1;

    if($year == date('Y') && $month == date('m'))
    {
        $this_day = date('d');
    }
    else
    {
        $this_day = date('t', mktime(0, 0, 0, $month, 1, $year)); // LAST DAY OF MONTH
    }

    if(is_leap_year($year) && $this_day == 29)
    {
        $last_day = 28;
    }
    else if(is_leap_year($last_year) && $this_day == 28)
    {
        $last_day = 29;
    }
    else
    {
        $last_day = $this_day;
    }

    if($month >= 2)
    {
        $this_year_start = $year;
        $last_year_start = $last_year;
    }
    else
    {
        $this_year_start = $year - 1;
        $last_year_start = $last_year - 1;
    }

    $this_ytd_start = $this_year_start.'-02-01';
    $last_ytd_start = $last_year_start.'-02-01';

    $this_ytd_end = $year.'-'.str_pad($month, 2, "0", STR_PAD_LEFT).'-'.$this_day;
    $last_ytd_end = $last_year.'-'.str_pad($month, 2, "0", STR_PAD_LEFT).'-'.$last_day;


}

最好的解决方案是什么?

谢谢!

4

9 回答 9

26

strtotime()可以解决问题。使用mktime()将您之前的日期转换为 Unix 时间戳,然后像这样使用它:

$from_unix_time = mktime(0, 0, 0, $month, $day, $year);
$day_before = strtotime("yesterday", $from_unix_time);
$formatted = date('Y-m-d', $day_before);
于 2009-04-23T14:18:40.533 回答
24

您还可以使用strtotime函数使用以下单词

$date = '2012-11-08';
$day_before = date( 'Y-m-d', strtotime( $date . ' -1 day' ) );

的输出$day_before

2012-11-07
于 2012-11-08T13:43:15.407 回答
6

您可以依靠 mktime() 处理“不正确”值的能力。假设 $year、$month 和 $day 是当天。

$yesterday = mktime (0, 0, 0, $month, $day - 1, $year);
echo date ('Y-m-d', $yesterday);

别担心,它只会做正确的事:尝试不同的价值观。

于 2009-04-23T14:28:47.903 回答
4

我确实会以这种方式使用 strtotime:

$date="2014-02-20";
echo date("Y-m-d",strtotime($date." -1 day"));

将输出:

2014-02-19
于 2014-02-20T21:47:46.763 回答
2
$date = date('Y-m-d',strtotime('yesterday'));
于 2011-04-08T13:56:35.257 回答
2

注意:以下答案未考虑夏令时;在一年中的某些时候,它会返回一个不准确的结果。有关更多信息,请参阅评论。


由于一天的长度是恒定的(86,400 秒),您可以使用算术来确定给定日期前一天的时间戳:

$yesterday = date('Y-m-d', strtotime($current_date) - 86400);

$current_date是您要查找前一天的日期。如果它已经是一个unix timestamp,你可以strtotime()完全省去:

$yesterday = date('Y-m-d', $current_date_as_unix_timestamp - 86400);
于 2011-12-23T18:42:34.587 回答
0

我认为这取决于您的雇主想要的行为。没有“正确”的答案——如果今天是一个财政年度的开始,他们是否希望比较过去两个财政年度(如果您使用昨天作为“最新”日期会发生这种情况)还是他们想要与上一财年的第一天相比,查看本财年的第一天?您需要坐下来找出潜在的边缘情况,然后与您的雇主讨论他们想要什么。

于 2009-04-23T14:26:49.297 回答
0

您还可以使用以下代码来工作:

$current_date = strtotime('25-11-2012');
echo $yesterday = date('Y-m-d', strtotime('-1 day', $current_date));

代码输出如下:

2012-11-24
于 2012-11-13T13:53:16.397 回答
0

固定时间前一天 07:59:59

$demo = date("Y-m-d H:i:s", mktime(7, 59, 59, date("m"),date("d")-1,date("Y")));    
于 2014-11-25T05:27:26.813 回答