全网整合营销服务商

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

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


相关文章: 建站之星多图banner生成与模板自定义指南  如何构建满足综合性能需求的优质建站方案?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  湖北网站制作公司有哪些,湖北清能集团官网?  建站VPS推荐:2025年高性能服务器配置指南  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何实现建站之星域名转发设置?  建站之星安装路径如何正确选择及配置?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何在Ubuntu系统下快速搭建WordPress个人网站?  建站之星如何通过成品分离优化网站效率?  做企业网站制作流程,企业网站制作基本流程有哪些?  建站之星如何防范黑客攻击与数据泄露?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何通过WDCP绑定主域名及创建子域名站点?  如何选择高效便捷的WAP商城建站系统?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  建站之星如何配置系统实现高效建站?  如何快速搭建安全的FTP站点?  如何续费美橙建站之星域名及服务?  如何安全更换建站之星模板并保留数据?  如何破解联通资金短缺导致的基站建设难题?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  网站制作的步骤包括,正确网址格式怎么写?  北京制作网站的公司,北京铁路集团官方网站?  建站主机类型有哪些?如何正确选型  Python多线程使用规范_线程安全解析【教程】  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站OpenVZ教程与优化策略:配置指南与性能提升  如何快速搭建个人网站并优化SEO?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何用低价快速搭建高质量网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  学校建站服务器如何选型才能满足性能需求?  如何获取上海专业网站定制建站电话?  建站之星与建站宝盒如何选择最佳方案?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何高效配置香港服务器实现快速建站?  如何高效配置IIS服务器搭建网站?  公众号网站制作网页,微信公众号怎么制作?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  重庆网站制作公司哪家好,重庆中考招生办官方网站?  微课制作网站有哪些,微课网怎么进?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  名字制作网站免费,所有小说网站的名字?  网站制作免费,什么网站能看正片电影?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  已有域名和空间,如何快速搭建网站? 

您的项目需求

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