我被要求实施一个系统,该系统每天早上六点自动生成一个报告,该报告包含开始和结束日期。报告实施本身已经起作用,但我正在努力理解的是如何获得我需要的日期。
结束日期应该是前一个工作日(周一到周五;脚本将在周末运行,但使用最近的星期五生成报告,星期一的报告也将使用星期五作为结束日期)。开始日期应该是该月第一天结束日期之前一年。我们目前手动指定日期。我理解如何使用DateTime对象来获取昨天的日期,但这并不是我正在寻找的。 p>
我如何获得这些日期?我知道我基本上可以创建一个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!!";
}
答案 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”的位置。我已对此进行了测试,并正确显示了日期。