Laravel 4获取当前时间并判断订单是否处于促销期的实现方法
解决促销时间段内设置订单标识的问题
看起来你已经搭好了基础代码框架,但还缺少当前时间与促销时间段的对比逻辑。从你的代码风格判断应该是Laravel项目,我推荐用Laravel默认集成的Carbon日期处理库来搞定这个问题——它能轻松解决时间格式解析、范围判断的痛点,比手动字符串处理靠谱多了。
完整修正后的代码
use Carbon\Carbon; $transaksi = new Transaction; $order_on_sale = 0; // 从配置中获取促销起止时间(如果需要直接从config表读取,看下方补充) $saleStart = Config::get('sale_start_date'); $saleFinish = Config::get('sale_finish_date'); if ($saleStart && $saleFinish) { // 按照数据库指定格式(YYYY-MM-DD HH:mm)将字符串转为Carbon对象 $startTime = Carbon::createFromFormat('Y-m-d H:i', $saleStart); $finishTime = Carbon::createFromFormat('Y-m-d H:i', $saleFinish); // 获取当前时间(自动适配应用配置的时区) $currentTime = Carbon::now(); // 判断当前时间是否在促销时间段内(默认包含起止时间点) if ($currentTime->between($startTime, $finishTime)) { $order_on_sale = 1; } } $transaksi->order_on_sale = $order_on_sale; $transaksi->save();
关键细节说明
- 为什么用Carbon? 比起直接对比时间字符串,Carbon能处理时区差异、自动兼容格式,还提供了
between这种简洁的方法来判断时间范围,完全避免手动拼接字符串可能踩的坑。 - 格式严格匹配:
createFromFormat('Y-m-d H:i', $saleStart)确保严格按照你数据库里的时间格式解析,不会因为格式不统一导致判断错误。 - 边界自定义:默认
between会包含起止时间点,如果需要排除边界,可以改成$currentTime->between($startTime, $finishTime, false)。
补充:如果需要直接从config表读取时间
如果你之前的Config::get是假设,实际要从config数据库表中获取时间,可以把配置读取部分替换成数据库查询:
// 从config表查询促销起止时间 $saleStart = DB::table('config')->where('name', 'sale_start_date')->value('time'); $saleFinish = DB::table('config')->where('name', 'sale_finish_date')->value('time');
这样就能准确判断用户下单时是否处于促销期,自动设置order_on_sale字段的值了。
内容的提问来源于stack exchange,提问作者Agus Suparman
相关产品推荐
相关产品推荐

