Как я могу узнать дату дня до даты? - PullRequest
4 голосов
/ 23 апреля 2009

У меня есть система, которая сравнивает финансовый год до текущей даты с тем же диапазоном дат предыдущего года. Вы можете настроить год и месяц для просмотра, и он всегда сравнивает один и тот же диапазон дат с предыдущим годом. Я установил его так, что если текущий день является високосным, он сравнивается с 28-м годом ранее, а если прошлый год был високосным, а сегодня 28 февраля, он сравнивается с прошлым годом до 29-го. если вы посмотрите на месяц, отличный от текущего, он будет отображаться до последнего дня этого месяца, в противном случае - до текущей даты.

Хорошо, сейчас все работает нормально, но теперь мои работодатели не хотят, чтобы это было до текущей даты, они хотят, чтобы это было до вчерашней даты. Как я могу это сделать, мои основные проблемы заключаются в том, что если сегодня 1-е число месяца, или что, если сегодня первый день финансового года.

Вот код, который у меня сейчас есть:

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;


}

Какое будет лучшее решение?

Спасибо!

Ответы [ 9 ]

24 голосов
/ 23 апреля 2009

strtotime () добьется цели. Преобразуйте предыдущую дату в метку времени Unix, используя mktime () , а затем используйте ее так:

$from_unix_time = mktime(0, 0, 0, $month, $day, $year);
$day_before = strtotime("yesterday", $from_unix_time);
$formatted = date('Y-m-d', $day_before);
21 голосов
/ 08 ноября 2012

Вы также можете использовать функцию strtotime , используя слова , например:

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

Выход $day_before:

2012-11-07
6 голосов
/ 23 апреля 2009

Вы можете положиться на способность mktime () работать с «неправильными» значениями. Предположим, $ year, $ month и $ day - текущий день.

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

Не волнуйтесь, это будет правильно: попробуйте другие значения.

3 голосов
/ 23 декабря 2011

Примечание: Следующий ответ не учитывает переход на летнее время; в определенные времена года он даст неточный результат. Смотрите комментарии для получения дополнительной информации.


Поскольку продолжительность дня постоянна (86 400 секунд), вы можете использовать арифметику, чтобы определить временную метку дня до указанной даты:

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

$current_date - это дата, которую вы хотите найти накануне. Если это уже метка времени Unix , вы можете полностью отказаться от strtotime():

$yesterday = date('Y-m-d', $current_date_as_unix_timestamp - 86400);
2 голосов
/ 21 февраля 2014

Я бы действительно использовал strtotime следующим образом:

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

выведет:

2014-02-19
2 голосов
/ 08 апреля 2011
$date = date('Y-m-d',strtotime('yesterday'));
0 голосов
/ 25 ноября 2014

За день до назначенного времени 07:59:59

$demo = date("Y-m-d H:i:s", mktime(7, 59, 59, date("m"),date("d")-1,date("Y")));    
0 голосов
/ 13 ноября 2012

Вы также можете использовать следующий код его работы:

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

И вывод кода следующий:

2012-11-24
0 голосов
/ 23 апреля 2009

Я думаю, это зависит от поведения, которое хочет ваш работодатель. Не существует «правильного» ответа - если сегодня начало финансового года, хотят ли они сравнить последние два финансовых года (что произойдет, если вы использовали вчера как «актуальную» дату) или они хотят увидеть первый день этого финансового года по сравнению с первым днем ​​прошлого года? Вам нужно сесть и выяснить возможные крайние случаи, а затем поговорить с вашим работодателем о том, чего они хотят.

...