全网整合营销服务商

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

免费咨询热线: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  # 字符串  # 对象  # 升序  # 未来  # 多个  # 当月  # 首日  # 而非  # 首个  # 转换为  # 跳过  # 为该 


相关文章: 如何在Ubuntu系统下快速搭建WordPress个人网站?  如何用PHP快速搭建高效网站?分步指南  企业微网站怎么做,公司网站和公众号有什么区别?  简单实现Android验证码  网站网页制作专业公司,怎样制作自己的网页?  建站主机选哪种环境更利于SEO优化?  制作网站公司那家好,网络公司是做什么的?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  建站之星伪静态规则如何正确配置?  建站VPS能否同时实现高效与安全翻墙?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  建站之星如何快速解决建站难题?  如何基于PHP生成高效IDC网络公司建站源码?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何快速生成高效建站系统源代码?  如何批量查询域名的建站时间记录?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  C#怎么创建控制台应用 C# Console App项目创建方法  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站主机默认首页配置指南:核心功能与访问路径优化  SQL查询语句优化的实用方法总结  网站插件制作软件免费下载,网页视频怎么下到本地插件?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何用虚拟主机快速搭建网站?详细步骤解析  高端网站建设与定制开发一站式解决方案 中企动力  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  宝塔Windows建站如何避免显示默认IIS页面?  ,网站推广常用方法?  ,交易猫的商品怎么发布到网站上去?  Android自定义listview布局实现上拉加载下拉刷新功能  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何在服务器上三步完成建站并提升流量?  建站之星客服服务时间及联系方式如何?  成都网站制作报价公司,成都工业用气开户费用?  建站之星2.7模板:企业网站建设与h5定制设计专题  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何通过建站之星自助学习解决操作问题?  建站之星CMS五站合一模板配置与SEO优化指南  广州商城建站系统开发成本与周期如何控制?  如何在自有机房高效搭建专业网站?  建站与域名管理如何高效结合?  简单实现Android文件上传  网站制作新手教程,新手建设一个网站需要注意些什么?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  建站之星后台管理:高效配置与模板优化提升用户体验 

您的项目需求

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