You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:03:16