我有一个系统,将会计年度与当前日期的比较与前一年的同一日期范围进行比较。您可以调整要查看的年份和月份,并始终将相同的日期范围与之前的年份进行比较。我知道如果当天是闰日,它与去年的第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;
}
什么是最好的解决方案?
谢谢!
答案 0 :(得分:24)
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);
答案 1 :(得分:20)
你也可以使用单词来使用strtotime功能:
$date = '2012-11-08';
$day_before = date( 'Y-m-d', strtotime( $date . ' -1 day' ) );
$day_before
的输出:
2012-11-07
答案 2 :(得分:6)
你可以依靠mktime()处理“不正确”值的能力。我们假设$ year,$ month和$ day是当天。
$yesterday = mktime (0, 0, 0, $month, $day - 1, $year);
echo date ('Y-m-d', $yesterday);
别担心,它会做正确的事情:尝试不同的价值观。
答案 3 :(得分:3)
注意:以下答案不考虑夏令时;在一年中的某些时间,它将返回不准确的结果。有关详细信息,请参阅注释。
由于一天的长度是常数(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);
答案 4 :(得分:2)
$date = date('Y-m-d',strtotime('yesterday'));
答案 5 :(得分:2)
我确实会以这种方式使用strtotime:
$date="2014-02-20";
echo date("Y-m-d",strtotime($date." -1 day"));
将输出:
2014-02-19
答案 6 :(得分:0)
我认为这取决于您的雇主想要的行为。没有“正确”的答案 - 如果今天是一个财政年度的开始,他们是否希望看到最近两个财政年度的比较(如果您将昨天用作“最多”日期会发生什么情况)或他们是否想要看到本财政年度的第1天与去年的第1天相比?您需要坐下来找出潜在的边缘案例,然后与您的雇主讨论他们想要什么。
答案 7 :(得分:0)
您还可以使用以下代码:
$current_date = strtotime('25-11-2012');
echo $yesterday = date('Y-m-d', strtotime('-1 day', $current_date));
代码输出如下:
2012-11-24
答案 8 :(得分:0)
在07:59:59固定的时间前一天
$demo = date("Y-m-d H:i:s", mktime(7, 59, 59, date("m"),date("d")-1,date("Y")));