PHP批量存储月度订单时日期字段异常存为1970年日期问题
问题根因
你遇到的1970年日期问题,是代码里的日期计算逻辑存在多层错误导致的:
- 核心错误:你将
date('d-m-Y', strtotime(...))返回的日期字符串强转为整数,比如格式化得到的字符串是02-10-2024,强转int时只会取第一个非数字字符前的数值,也就是2,后续你把这个2当做Unix时间戳传入date()格式化,时间戳2对应的就是Unix纪元起始点(1970年1月1日)附近的日期,直接导致存入的日期异常。 - 逻辑错误:循环中计算递增日期时,你始终拿初始的开始日期
$fdate加1天,完全没有用到循环变量$i,就算不做强转操作,除了第一条订单外所有订单的日期都会是开始日期+1天,根本实现不了逐天递增的效果。 - 附带bug:所有订单共用同一个
$orderid,如果数据库order_id字段设了唯一约束会直接插入失败;另外客户名取值写反了,你把商品名赋值给了$customer变量,根本没有用到查询出来的客户表数据;直接用86400秒计算日期间隔没有考虑夏令时场景,可能出现天数计算偏差。
修复方法
- 全程用时间戳做日期偏移计算,不要把格式化后的日期字符串强转成整数,循环时直接基于初始时间戳叠加
$i天的秒数得到对应日期,避免无效类型转换。 - 把订单ID生成逻辑放到循环内部,保证每个订单ID唯一;修正客户名的取值逻辑,从查询到的客户数据中取对应字段。
- 建议对传入的日期参数做格式校验,避免
strtotime返回false导致计算异常。
修正后的可运行代码如下:
public function orderdatastore(Request $request){ $userid = 'GWU458910'; $pid = $request->product_id; // 查询商品信息 $product_data = DB::table('products')->where('product_id',$pid)->first(); $product_name = $product_data->product_name; $selling_price = $product_data->selling_price; // 查询客户信息 $customer_data = DB::table('customer_registrations')->where('customer_id',$userid)->first(); // 注意替换为你客户表实际存储用户名的字段名 $customer = $customer_data->customer_name; $fdate=$request->start_date; $tdate=$request->end_date; $datetime1 = strtotime($fdate); $datetime2 = strtotime($tdate); // 计算间隔天数,向下取整规避夏令时导致的偏差 $days = floor(($datetime2 - $datetime1)/86400); for ($i=0; $i <= $days ; $i++) { // 每个订单生成唯一ID $orderid = "ORD".rand(10,99).rand(25,35).rand(155,255).$i; $order = new Orders; $order->order_id = $orderid; $order->product_id = $request->product_id; $order->mobile = $request->mobile; $order->user_id = $request->userid; $order->user_name = $customer; $order->product_name = $product_name; $order->product_quantity = $request->quantity; // 直接基于初始时间戳偏移$i天,格式化得到对应日期 $order->order_date = date('Y-m-d', strtotime("+{$i} days", $datetime1)); $order->product_selling_price = $selling_price; $order->order_start_date = $fdate; $order->order_end_date = $tdate; $order->payment_mode = $request->payment_mode; $order->save(); } echo "All data Saved"; }
如果你用的是Laravel框架,更推荐用内置的Carbon扩展处理日期,代码可读性更高,也能自动规避夏令时、格式转换等常见问题。
内容的提问来源于stack exchange,提问作者Mind
相关产品推荐
相关产品推荐

