У меня есть система, которая сравнивает финансовый год и текущую дату с тем же диапазоном дат года. Вы можете настроить год и месяц, чтобы посмотреть, и он всегда сравнивает тот же диапазон дат с годом предыдущего. Я установил его так, если текущий день – это високосный день, он сравнивается с 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; }
Что было бы лучшим решением?
Благодаря!
strtotime () будет делать трюк. Преобразуйте свою предыдущую дату в временную метку Unix, используя mktime () , затем используйте ее следующим образом:
$from_unix_time = mktime(0, 0, 0, $month, $day, $year); $day_before = strtotime("yesterday", $from_unix_time); $formatted = date('Ym-d', $day_before);
Вы также можете использовать функцию strtotime, используя следующие слова :
$date = '2012-11-08'; $day_before = date( 'Ym-d', strtotime( $date . ' -1 day' ) );
Вывод $day_before
:
2012-11-07
Вы можете полагаться на способность mktime () работать с «неправильными» значениями. Предположим, что год, месяц и день – это текущий день.
$yesterday = mktime (0, 0, 0, $month, $day - 1, $year); echo date ('Ym-d', $yesterday);
Не волнуйтесь, он будет делать правильные вещи: попробуйте себя с разными ценностями.
Примечание . Следующий ответ не учитывает летнее время; в определенные периоды года он вернет неточный результат. См. Комментарии для получения дополнительной информации.
Поскольку длительность дня постоянна (86 400 секунд), вы можете использовать арифметику для определения отметки времени за день до заданной даты:
$yesterday = date('Ym-d', strtotime($current_date) - 86400);
$current_date
– это дата, которую вы хотите найти за день до этого. Если это уже временная метка unix , вы можете полностью отказаться от strtotime()
:
$yesterday = date('Ym-d', $current_date_as_unix_timestamp - 86400);
$date = date('Ym-d',strtotime('yesterday'));
Я бы использовал strtotime действительно, таким образом:
$date="2014-02-20"; echo date("Ymd",strtotime($date." -1 day"));
выведет:
2014-02-19
Я думаю, это зависит от поведения, которое хочет ваш работодатель. Нет «правильного» ответа – если сегодня начинается финансовый год, хотят ли они сравнить последние два финансовых года (это то, что произойдет, если вы использовали вчера как «до» даты) или они хотят чтобы увидеть день 1 этого финансового года по сравнению с первым днем последнего? Вам нужно сесть и выяснить возможные крайние случаи, а затем поговорить с вашим работодателем о том, чего они хотят.
Вы также можете использовать следующий код:
$current_date = strtotime('25-11-2012'); echo $yesterday = date('Ym-d', strtotime('-1 day', $current_date));
И вывод кода следующий:
2012-11-24
Один день до времени при фиксированном 07:59:59
$demo = date("Ymd H:i:s", mktime(7, 59, 59, date("m"),date("d")-1,date("Y")));