如何获取最近的到期日期(忽略无效日期并正确排序)

19次阅读

如何获取最近的到期日期(忽略无效日期并正确排序)

本文介绍如何从包含多个到期日期的 json 数组中,准确筛选出最近的有效到期日期(如 “2022-03″),自动排除占位符 “0000-00″,并通过时间戳转换与排序确保逻辑正确性。

在处理商品批次、库存有效期或金融合约等业务场景时,常需从一组 expiration 字符串(格式为 yyYY-MM)中找出距离当前最近的未来/已临期但有效的到期月份。注意:题中“最近”实际指时间值最小的有效日期(即最早到期的那个,如 2022-03 早于 2023-02),而非字典序最小——因此直接使用 min($item->expiration) 会因字符串比较导致错误(例如 “2022-03”

正确做法是将 YYYY-MM 转换为可比较的时间基准(如 unix 时间戳),再排序取首个有效项。以下是推荐实现:

function getNearestExp(string $jsonItems): array {     $items = json_decode($jsonItems, associative: true);     if (json_last_error() !== JSON_ERROR_NONE) {         throw new InvalidArgumentException('Invalid JSON input');     }      $validExpirations = [];     foreach ($items as $item) {         $exp = $item['expiration'] ?? '';         // 排除无效占位符         if ($exp === '0000-00' || !preg_match('/^d{4}-d{2}$/', $exp)) {             continue;         }         // 转为当月第一天时间戳(确保月份比较准确,避免时区歧义)         $timestamp = strtotime("{$exp}-01");         if ($timestamp === false) {             continue; // 跳过非法日期,如 "2023-13"         }         $validExpirations[$timestamp] = $item;     }      if (empty($validExpirations)) {         throw new RuntimeException('No valid expiration dates found');     }      ksort($validExpirations); // 升序:最早到期的排第一     return array_values($validExpirations)[0]; }  // 使用示例: $itemsJson = '[{"expiration": "0000-00", "quantity": -50}, {"expiration": "2023-02", "quantity": 100}, {"expiration": "2022-03", "quantity": 50}]'; try {     $nearest = getNearestExp($itemsJson);     print_r($nearest); // 输出: Array ( [expiration] => 2022-03 [quantity] => 50 ) } catch (Exception $e) {     error_log($e->getMessage()); }

关键要点说明:

  • 使用 strtotime(“YYYY-MM-01”) 将月份标准化为该月首日时间戳,规避 strtotime(“2022-03”) 在部分 php 版本中可能返回 false 的风险;
  • 严格校验日期格式(正则 /^d{4}-d{2}$/)和解析结果,增强鲁棒性;
  • 错误处理覆盖 jsON 解析失败、无有效日期等边界情况;
  • 返回原始数组结构(非对象),便于后续直接使用 $item[‘quantity’] 等字段。

⚠️ 注意:若业务语义中“最近”指距离今天最近的未来到期日(即尚未到期但最临近),则需额外过滤 $timestamp >= strtotime(‘today’) 并改用 array_filter() 预筛选,再取 min() —— 本文按题干明确要求(取 2022-03)采用“最早有效到期日”逻辑。

text=ZqhQzanResources