在PHP中获取特定日期

时间:2015-12-30 20:28:07

标签: php date datetime

我被要求实施一个系统,该系统每天早上六点自动生成一个报告,该报告包含开始和结束日期。报告实施本身已经起作用,但我正在努力理解的是如何获得我需要的日期。

结束日期应该是前一个工作日(周一到周五;脚本将在周末运行,但使用最近的星期五生成报告,星期一的报告也将使用星期五作为结束日期)。开始日期应该是该月第一天结束日期之前一年。我们目前手动指定日期。我理解如何使用DateTime对象来获取昨天的日期,但这并不是我正在寻找的。

我如何获得这些日期?我知道我基本上可以创建一个if语句,如果当天是周六,周日或周一,则使用星期五的日期,但我可以从哪里开始?我只需要日,月和年。一天中的时间并不重要,因为脚本会在生成新报告时记录当前时间戳。

这是我到目前为止所做的。

//Build the Inventory Part Report
function RunTest()
{
    //End date should be last business day
    $end_date = new DateTime();
    $end_date->add(DateInterval::createFromDateString("yesterday"));

    //Start date should be one year before end date on first day of that month
    $start_date;

    //$start_date="2014-12-01";
    //$end_date="2015-12-30";

    //Method generates report
    generateReport($start_date, $end_date);

    echo "New Report Generated Successfully!!";

}

4 个答案:

答案 0 :(得分:0)

你可以利用PHP的相对日期(编写此代码的人是传奇)

例如..

$date = new DateTime('first day of week');

这是我的头脑,可能无法正常工作..我会链接官方documentation

答案 1 :(得分:0)

  

我可以从哪里出发?我只需要日,月和年。

获取DateTime对象时,只需zero out the小时/分钟/秒。

$dt = new DateTime();
$dt->setTime(0, 0, 0);

表示日期的Date对象与表示00:00:00的日期的DateTime对象(PHP没有前者)之间没有区别

答案 2 :(得分:0)

您可能需要测试last Friday案例,但我认为应该这样做:

$end_date;
$start_date;

if (date("w") == 0 || date("w") == 6 || date("w") == 1)
{
    $end_date = strtotime('last Friday');
}
else
{
    $end_date = strtotime("-1 day");
}

$start_date = strtotime(date("m/d/Y", $end_date)." -1 year");

echo date("m/d/Y", $start_date)." to ".date("m/d/Y", $end_date);

今天的输出是12/29/2014 to 12/29/2015

如果星期几是0,1或6(星期日,星期一或星期六),我们上周五使用,否则我们只使用前一天,然后我们有$end_date。要获得$start_date,我们只需减去一年。

strtotime()是一项非常有用的功能,您可以在此处详细了解:
http://www.w3schools.com/php/func_date_strtotime.asp

答案 3 :(得分:0)

我找到了将开始日期定为去年第一天的解决方案。它遵循我今天早些时候批准的解决方案,最终结果如下:

//End date should be last business day; Sunday, Monday, and Saturday all use the previous Friday for their end date
if(date("w") == 0 || date("w") == 6 || date("w") == 1){
    $end_date = date("Y-m-d", strtotime("last Friday"));
}
else{
    $end_date = date("Y-m-d", strtotime("-1 day"));
}

//Start date should be on eyear before end date on first day of that month
$tempStart = strtotime($end_date . " -1 year");
$start_date = date("Y-m-1", $tempStart);

正如你所看到的,最后一行只是将1放在“d”的位置。我已对此进行了测试,并正确显示了日期。