咨询POS系统中用strtotime('+0/-0 days')获取今日销售数据的正确性
POS系统今日销售数据的日期处理优化建议
你的代码里用strtotime('+0 days')或strtotime('-0 days')确实能获取到今日日期,功能上可以正常运行,但这不是最简洁、语义最清晰的写法,有更符合PHP最佳实践的替代方案:
核心优化点
- 要获取今日日期,完全没必要调用
strtotime('+0 days'),直接用date("Y-m-d")即可,因为date()默认就基于当前时间生成日期。 - 或者用
strtotime('today'),语义更明确,一眼就能看出是要获取今日的起始时间。
其他时间条件的优化建议
原代码里的其他时间筛选也可以用更精准、语义更清晰的写法:
- 昨日:用
strtotime('yesterday')替代strtotime('-1 days') - 上周:用
strtotime('-1 week')替代固定的-7 days(适配跨周场景) - 上月:用
strtotime('-1 month')替代固定的-31 days(自动适配不同月份的天数差异,比如2月、30天的月份)
修正代码中的bug
注意原代码最后一个elseif分支少了判断条件,应该是elseif ($criteria == 'sales_past_month'),否则不管$criteria是什么值,都会走到这个分支,这会导致逻辑错误。
优化后的完整代码
case 'sales_today': case 'sales_past_day': case 'sales_past_week': case 'sales_past_month': $start_date = false; $end_date = false; if ($criteria == 'sales_today') { // 直接获取今日日期,无需多余的strtotime调用 $start_date = date("Y-m-d"); $end_date = date("Y-m-d 23:59:59"); } elseif ($criteria == 'sales_past_day') { $start_date = date("Y-m-d", strtotime('yesterday')); $end_date = date("Y-m-d 23:59:59"); } elseif ($criteria == 'sales_past_week') { $start_date = date("Y-m-d", strtotime('-1 week')); $end_date = date("Y-m-d 23:59:59"); } elseif ($criteria == 'sales_past_month') // 修正此处的判断条件 { $start_date = date("Y-m-d", strtotime('-1 month')); $end_date = date("Y-m-d 23:59:59"); } $this->load->model('Sale'); $item_ids = $this->Sale->get_item_ids_sold_for_date_range($start_date, $end_date, $supplier_id);
额外严谨性建议
如果你的数据库中销售时间是带时分秒的datetime类型,建议采用>= 今日00:00:00 AND < 明日00:00:00的查询逻辑,避免因订单时间刚好是00:00:00而被漏掉的边界问题:
if ($criteria == 'sales_today') { $start_date = date("Y-m-d 00:00:00"); // 获取明日零点的时间 $end_date = date("Y-m-d 00:00:00", strtotime('+1 day')); // 数据库查询时使用:WHERE sale_time >= ? AND sale_time < ? }
内容的提问来源于stack exchange,提问作者Fayz I
相关产品推荐
相关产品推荐

