Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I find out the date of the day before a date?

Tags:

php

php4

I have a system that compares fiscal year up to the current date to the same date range of the year before. You can adjust the year and month to look at and it always compares the same date range to the year previous. I have it set so if the current day is leap day it compares to the 28th of last year, and if last year was leap year and today is feb 28th it compares to last year up to 29th. if you look at a month other than the current month it shows up to the last day of that month, otherwise up to current date.

OK that works fine right now, but now my employers don't want it to be up to the current date they want it to go up to yesterdays date. How can I do that, my main concerns are what if today is the 1st of the month, or what if today is the first day of the fiscal year.

Here is the code I have now:

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;


}

What would be the best solution?

Thanks!

like image 579
JD Isaacks Avatar asked Apr 23 '09 14:04

JD Isaacks


4 Answers

strtotime() will do the trick. Convert your previous date to a Unix timestamp using mktime(), then use it like this:

$from_unix_time = mktime(0, 0, 0, $month, $day, $year);
$day_before = strtotime("yesterday", $from_unix_time);
$formatted = date('Y-m-d', $day_before);
like image 90
Seb Avatar answered Nov 10 '22 14:11

Seb


You can also use strtotime function using words like this:

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

The output of $day_before:

2012-11-07
like image 29
Peon Avatar answered Nov 10 '22 15:11

Peon


You can rely on mktime()’s ability to work with “incorrect” values. Let’s assume $year, $month and $day are current day.

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

Don’t worry, it will just do the right thing: try yourself with different values.

like image 6
Ilya Birman Avatar answered Nov 10 '22 15:11

Ilya Birman


I would use strtotime indeed, in this way:

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

will output:

2014-02-19
like image 4
patrick Avatar answered Nov 10 '22 16:11

patrick