保质期计算器
计算过期日期,管理商品保质期
什么是保质期计算器?
保质期计算器是一个在线工具,帮助您快速计算商品的过期日期或推算生产日期。只需输入生产日期和保质期天数,即可得出准确的过期时间;或输入过期日期反推生产日期。支持批量添加多个商品,实时显示剩余天数提醒,方便管理家中食品、药品、化妆品等商品的保质期。本工具浏览器本地运行,无需上传数据,保护您的隐私安全。计算保质期或到期日时,关键是明确按自然日、工作日、月份还是固定小时计算。食品、药品、合同、证书、优惠券和项目期限,可能对起算日、截止日、时区和取整方式有不同规则。这个工具适合快速获得参考日期,但涉及法律、医疗、财务或正式履约的期限时,仍应回到原始说明和适用规则核对。
使用方法
使用步骤
- 选择计算模式:生产日期 → 过期日期,或 过期日期 → 生产日期
- 输入日期与保质期天数
- 点击「计算」查看结果
- 加入产品列表,方便批量管理
结果核对
- 确认保质期是从生产日期、包装日期、开封日期还是收货日期起算;这些规则不可互换。
- 对于食品、药品或受监管商品,请以印刷标签和当地规定为最终依据。
使用场景
技术原理
到期计算是基于生产日期的整数日期算术。正向路径使用 Date.setDate(date.getDate() + n) 计算 expiry = production + shelf_life_days,该方法原生处理月份和年份进位(如 2025-01-31 + 30 = 2025-03-02,因为二月有 28 天)。反向路径用相同方式计算 production = expiry - shelf_life_days。为避免午夜附近的夏令时偏移,页面通过 Date.UTC(y, m, d) 将算术锚定到 UTC,并加上整毫秒数(n * 86400000),因为本地时间的 Date.setDate 在跨越夏令时边界时会产生一小时偏移,可能在三月和十一月(美国)或十月(欧盟)的切换日翻转可见日期。 保质期单位在加法运算前先归一化为天数:1 个月视为 30 天,1 年视为 365 天,这与大多数消费品包装上的计算方式一致,但不是监管机构使用的精确日历规则。《食品法典委员会预包装食品标签通用标准》(CXS 1-1985 修订版)和中国的 GB 7718-2025 规定保质期从生产日期或包装日期起算;药品有效期遵循 ICH Q1A (R2) 稳定性测试指南,打印的有效期取当月最后一天(因此 2024-08-15 生产、保质期 18 个月的药品标注为 2026-02-28,而非 2026-02-15)。剩余天数计数器为 (expiry_utc - now_utc) / 86400000,已过期用 Math.floor 向下取整,距过期时间用 Math.ceil 向上取整;新鲜度分级是阈值比较:remaining < 0 为已过期,0 ≤ remaining ≤ 30 为即将过期,否则为正常。 持久化的关注列表存储在 window.localStorage 中,使用单一命名空间键,通过 JSON.stringify 序列化,大多数浏览器对每个来源的存储上限约为 5-10 MB(Chrome 约 10 MB,Safari 约 5 MB)。超出配额时浏览器抛出 name 为 'QuotaExceededError' 的 DOMException,之后的写入会被静默丢弃,因此页面必须回退到内存状态。localStorage 是同步且同源的,条目在页面刷新后保留,但数据不会离开设备。浏览器通知 API(提醒功能所用)需要 Notification.requestPermission(),按来源授权,在 Windows ≥ 86 的 Chrome 上实际通过系统通知中心而非浏览器本身弹出。
- 日期算术:Date.setDate(d.getDate() + n) 原生处理月份/年份进位,但在本地时间跨越夏令时边界时可能翻转日期;Date.UTC + 整毫秒数是安全的做法。
- 单位归一化:1 个月 ≈ 30 天,1 年 ≈ 365 天——简单但不是精确日历值;药品标签遵循 ICH Q1A (R2),取有效期当月最后一天。
- 剩余天数 = Math.floor((expiry_utc - now_utc) / 86400000);阈值:remaining < 0 → 已过期,0 ≤ remaining ≤ 30 → 即将过期,否则正常。
- 法规依据各异:食品保质期遵循 Codex CXS 1-1985 / GB 7718-2025(从生产或包装日期起算);化妆品使用 PAO(开封后使用期限),从首次使用起算;药品使用 ICH Q1A 稳定性测试日期。
- 开封后保质期独立于印刷有效期且更短(如橄榄油开封后约 3 个月,而密封保质期为 24 个月);需单独记录开封日期。
- localStorage 配额约为每个来源 5-10 MB,满时抛出 QuotaExceededError(DOMException);抛出后的写入会被静默丢弃,因此需将 setItem 包裹在 try/catch 中并向用户提示警告。
- 浏览器时钟偏差(系统日期配置错误)会偏移新鲜度分级;页面读取 new Date() 而非远程时间源,因此继承客户端的任何时钟误差。
示例
生产日期 2026-01-01 + 730 天 = 2027-12-31
模式:生产日期 -> 到期日
生产日期:2026-01-01
保质期:730 天(2 年)
到期日:2027-12-31
状态:仍在保质期内药品:18 个月保质期
药品批号:A26-0215
生产日期:2026-02-15
保质期:18 个月(约 548 天)
到期日:2027-08-15
标签备注 - 药品行业惯例:到期日按月末计,
标注日期可能写作 2027-08-31反向计算:到期日 -> 生产日期
模式:到期日 -> 生产日期
包装上标注的到期日:2028-06-30
保质期:36 个月
生产日期不晚于:2025-06-30
可用于核对供应商提供的生产日期
是否与批号标签一致食品库存检查
商品:橄榄油 500ml
生产日期:2025-12-01
保质期:24 个月
到期日:2027-12-01
检查:在保质期内;按 FIFO 周转库存,到期前约 30 天可安排打折常见问题
到期日期是怎么算出来的?
生产日期 + 保质期 = 到期日期。保质期支持按天、周、月、年填写。按月相加时,如果目标月没有对应的日期,会自动取该月最后一天(例如 1 月 31 日 + 1 个月 = 2 月 28/29 日),这与大多数监管机构对“自生产之日起 X 个月”的解读一致。
剩余天数是从今天开始算的吗?
是的。工具会按本地时区的当前日期,显示剩余的天数、周数和月数。负值表示产品已过期。状态标签(新鲜/临期/已过期)方便你快速分类。
best-before 和 use-by 有什么区别?
best-before(最佳食用日期)是品质指标——超过仍然安全,只是风味或口感可能有所下降。use-by(保质截止日期)是安全指标,过期后食用可能存在健康风险。化妆品和药品上常见的 PAO(开封后使用期限)符号,会在产品开封后覆盖原本印刷的到期日期。
结果有考虑储存条件吗?
没有。印刷的保质期假设按厂家推荐方式储存(阴凉、干燥、密封、冷藏或冷冻)。高温、潮湿和光照会缩短实际保质期,工具无法对此建模,请把计算结果当作上限。
“过期”的食品或药品该怎么处理?
未开封的罐头和干货稍过最佳食用日期通常没问题——观察一下外观和气味即可。乳制品、肉类和鱼类一旦超过保质截止日期就应丢弃。过期药品可能失效,部分还会变得不安全,重要治疗时不要依赖它们。
可以同时跟踪多个产品吗?
可以多开几个标签页,每个标签页相互独立。工具不会保存库存信息。如需长期追踪,建议使用库存管理 App 或简单的电子表格。
我的数据会被上传吗?
不会。计算在浏览器中完成,会话之间也不会被保存。