全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

在处理商品批次、库存有效期或金融合约等业务场景时,常需从一组 expiration 字符串(格式为 YYYY-MM)中找出距离当前最近的未来/已临期但有效的到期月份。注意:题中“最近”实际指时间值最小的有效日期(即最早到期的那个,如 2025-03 早于 2025-02),而非字典序最小——因此直接使用 min($item->expiration) 会因字符串比较导致错误(例如 "2025-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; // 跳过非法日期,如 "2025-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": "2025-02", "quantity": 100}, {"expiration": "2025-03", "quantity": 50}]';
try {
    $nearest = getNearestExp($itemsJson);
    print_r($nearest); // 输出: Array ( [expiration] => 2025-03 [quantity] => 50 )
} catch (Exception $e) {
    error_log($e->getMessage());
}

关键要点说明:

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

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


# php  # js  # json  # unix  # 金融  # yy  # timestamp  # 字符串  # 对象  # 升序  # 未来  # 多个  # 当月  # 首日  # 而非  # 首个  # 转换为  # 跳过  # 为该 


相关文章: 网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站之星代理商如何保障技术支持与售后服务?  h5在线制作网站电脑版下载,h5网页制作软件?  音乐网站服务器如何优化API响应速度?  如何快速搭建FTP站点实现文件共享?  网站微信制作软件,如何制作微信链接?  如何在自有机房高效搭建专业网站?  如何彻底卸载建站之星软件?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  香港服务器租用每月最低只需15元?  再谈Python中的字符串与字符编码(推荐)  如何用VPS主机快速搭建个人网站?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  安徽网站建设与外贸建站服务专业定制方案  如何在VPS电脑上快速搭建网站?  网页设计网站制作软件,microsoft office哪个可以创建网页?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  如何生成腾讯云建站专用兑换码?  如何在景安服务器上快速搭建个人网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  如何在腾讯云服务器快速搭建个人网站?  建站DNS解析失败?如何正确配置域名服务器?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  建站主机功能解析:服务器选择与快速搭建指南  如何通过商城自助建站源码实现零基础高效建站?  seo网站制作优化,网站SEO优化步骤有哪些?  实现虚拟支付需哪些建站技术支撑?  如何在云主机上快速搭建多站点网站?  如何快速查询域名建站关键信息?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  如何选择最佳自助建站系统?快速指南解析优劣  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  ,想在网上投简历,哪几个网站比较好?  如何确保FTP站点访问权限与数据传输安全?  制作宣传网站的软件,小红书可以宣传网站吗?  如何规划企业建站流程的关键步骤?  设计网站制作公司有哪些,制作网页教程?  非常酷的网站设计制作软件,酷培ai教育官方网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何通过云梦建站系统实现SEO快速优化?  如何用PHP快速搭建CMS系统?  如何通过远程VPS快速搭建个人网站?  一键网站制作软件,义乌购一件代发流程?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。