使用方法
- 打开页面已经填好生产日期 2026-03-01、保质期 180 天、按天、口径 A、今天 2026-10-13,结果区给出两个口径的到期日。点「推算」,或在数字框里按回车,结果立刻刷新。
- 「保质期数值」范围 1 到 10950(30 年),步长 1。填了小数或超出范围会给出指明原因的提示。
- 单位三选一:按天、按月、按年。按月与按年走「对应日」口径,并且会夹到该月最后一天——2025-01-31 加 1 个月得 2025-02-28,不是 3 月 3 日。
- 起算口径二选一:口径 A 认为生产当天算第 1 天,到期日 = 生产日 + 天数 − 1;口径 B 认为生产次日算第 1 天,到期日 = 生产日 + 天数。默认示例下两者分别是 2026-08-27 与 2026-08-28。
- 「今天」默认 2026-10-13,请改成实际日期再算剩余天数与剩余比例。
- 「开盖日期」与「开盖后使用期」成对填写,用于算开盖后使用期那条独立的时间线;只填其中一个会给出指名缺哪个的提示。
- 结果区分三层:上面一行是两个口径的到期日,中间是明细(跨度天数、与今天的关系、剩余比例、临期判定),下面在有开盖数据时多出一条开盖后使用期。
- 下面的常见保质期对照表共 20 行,默认显示 12 行。点「加载更多」展开全部,点「导出 CSV」存成带字节序标记的文件;「复制对照表」复制正文那张起算口径表。
这个 Expiration日期计算器能解决什么问题
第一类是把包装上的「保质期 180 天」换成具体某一天。生产日期印在瓶底、保质期写在侧面,心算跨月很容易错一天,而差一天在临期盘点上就是合规与不合规的区别。这一页把两种起算口径都算出来,让你按产品的执行标准挑一个。
第二类是月末的坑。保质期按「月」标注时,1 月 31 日生产的东西加 1 个月没有 2 月 31 日,只能落到 2 月 28 日;2024 年 2 月 29 日生产、保质期 12 个月的东西,2025 年没有 2 月 29 日,只能落到 2 月 28 日。这类日期越界是程序里最常见的 bug,本页手动夹紧,不会像 JS 的 setMonth 那样把 1 月 31 日加 1 个月变成 3 月 3 日。
第三类是临期盘点。剩余天数本身不好比——30 天的保质期剩 10 天和 3 年的保质期剩 10 天完全不是一回事——换成剩余比例才可比。本页给出剩余比例并标出常见的两个阈值。
第四类是开盖后的第二条时间线。化妆品、药品、食用油这类产品开封之后的可用期与生产日期无关,只从开盖那天算起。两条线取更早的那个,本页分开算并提示取早者。
计算原理与变量说明
整页只有两条公式,加一个夹紧规则。
| 变量 | 公式 | 说明 |
|---|---|---|
| 口径 A 到期日 | 生产日 + 天数 − 1 | 生产当天算第 1 天 |
| 口径 B 到期日 | 生产日 + 天数 | 生产次日算第 1 天 |
| 按月 / 按年 | 对应日,再夹到该月最后一天 | 两种口径落在同一天 |
| 剩余比例 | 剩余天数 ÷ 跨度天数 × 100 | 单位是百分点 |
| 开盖后使用期 | 开盖日 + 月数(对应日) | 与生产日独立 |
起算日到底算不算第一天——两种口径差 1 天,这是本页的核心。口径 A 认为生产当天就是保质期的第 1 天,到期日 = 生产日 + 天数 − 1;口径 B 认为生产次日才是第 1 天,到期日 = 生产日 + 天数。同样是 2026-03-01 生产:加 30 天时 A 得 2026-03-30、B 得 2026-03-31;加 180 天时 A 得 2026-08-27、B 得 2026-08-28;加 365 天时 A 得 2027-02-28、B 得 2027-03-01。国标 GB 7718 对保质期起算的表述要按具体产品标准执行,本页不能替你选,所以两个都算。
按「月」标注走对应日口径,月末不足就落回该月最后一天。生产 2025-03-31 加 12 个月得 2026-03-31;但生产 2025-01-31 加 1 个月,2 月只有 28 天,只能落 2025-02-28;生产 2024-02-29 加 12 个月,2025 年没有 2 月 29 日,只能落 2025-02-28。这是日期库最常见的越界 bug:JS 的 setMonth 会自动溢出,1 月 31 日加 1 个月会变成 3 月 3 日,凭空多出两天。本页先算出目标年月、再取该月天数与原日号的较小值,全程手动夹紧,不用 setMonth。另外按月与按年时,起算日是否计入已经包含在「对应日」这个口径里,所以两种口径落在同一天。
剩余比例比剩余天数更有用。生产 2026-07-13、到期 2027-04-13、今天 2026-10-13:剩余 182 天、跨度 274 天,剩余比例 66.42 个百分点;生产 2026-10-01、到期 2026-11-13、今天 2026-10-13:剩余 31 天、跨度 43 天,剩余比例 72.09 个百分点。两组剩余天数差 6 倍,但比例差不多。常见做法是剩余比例低于 33.33 个百分点视作临期、低于 20 个百分点通常要求下架或专区销售——各地与连锁超市的规定并不一致,中国也没有全国强制统一值,本页只是把阈值算出来供参考。
开盖后使用期是与生产日完全独立的一条时间线。欧盟化妆品法规 (EC) 1223/2009 要求标注开盖后使用期,写成 6M、12M 的开罐小图标。2026-10-13 开封、12M 的保质期,开盖后到期日是 2027-10-13。一瓶 2027 年到期的面霜,2026 年 10 月开封后可能 2027 年 10 月就该扔——两条线取更早的那个,本页分开算并提示取早者。
完整示例(数值仅作演示)
默认示例:生产 2026-03-01、保质期 180 天。口径 A 得 2026-08-27,口径 B 得 2026-08-28,两者相差 1 天。跨度分别是 179 天与 180 天。
把今天填成 2026-08-01 再看:距口径 A 到期还有 26 天,剩余比例 26 ÷ 179 = 14.53 个百分点,已跌破 20 个百分点这一档,属于专区销售区间。
月末那组:生产 2025-01-31、按月、1 个月,得 2025-02-28;生产 2024-02-29、按年、1 年,得 2025-02-28;生产 2025-03-31、按月、12 个月,得 2026-03-31。三行都是手动夹紧的结果。
开盖那组:生产 2026-03-01、保质期 180 天(到期 2026-08-27),开盖 2026-10-13、12M → 开盖后到期 2027-10-13。但开盖日已经在保质期到期日之后,说明这瓶东西开封时本身已经过期,页面会提示先按更早的那条线处理。
常见保质期对照表
第一张表是两种起算口径的对照,「复制对照表」复制的就是它。
| 保质期 | 生产日期 | 口径 A | 口径 B | 相差 |
|---|---|---|---|---|
| 30 天 | 2026-03-01 | 2026-03-30 | 2026-03-31 | 1 天 |
| 180 天 | 2026-03-01 | 2026-08-27 | 2026-08-28 | 1 天 |
| 365 天 | 2026-03-01 | 2027-02-28 | 2027-03-01 | 1 天 |
| 1 个月 | 2025-01-31 | 2025-02-28 | 2025-02-28 | 0 天 |
| 12 个月 | 2024-02-29 | 2025-02-28 | 2025-02-28 | 0 天 |
| 12 个月 | 2025-03-31 | 2026-03-31 | 2026-03-31 | 0 天 |
第二张表是剩余比例与临期判定,用来说明为什么比例比天数好用。
| 场景 | 剩余 | 跨度 | 剩余比例 | 判定 |
|---|---|---|---|---|
| 乳制品 2026-07-13 产,2027-04-13 到期 | 182 | 274 | 66.42 | 正常 |
| 面包 2026-10-01 产,2026-11-13 到期 | 31 | 43 | 72.09 | 正常 |
| 临期阈值 | — | — | 33.33 | 低于算临期 |
| 下架 / 专区阈值 | — | — | 20 | 低于通常下架 |
第三张表是开盖后使用期(PAO),与生产日那条线并列。
| 场景 | 开盖日 | PAO | 开盖后到期 |
|---|---|---|---|
| 面霜 6M | 2026-10-13 | 6 个月 | 2027-04-13 |
| 面霜 12M | 2026-10-13 | 12 个月 | 2027-10-13 |
| 法规依据 | (EC) 1223/2009 | 6M / 12M | 开罐小图标 |
| 取早原则 | 两条线 | — | 取更早的那一天 |
读法:第一张看两种口径差在哪,第二张看剩余比例与阈值,第三张看开盖那条独立的时间线。
结果边界、舍入与适用说明
- 生产日期为空或格式不对时提示请按 2026-03-01 这样的格式填写;填了 2026-02-30 这种日历上不存在的日期时提示该月实际有多少天。
- 保质期数值留空、写成小数或超出 1 到 10950 时,分别给出指明原因的提示,不自动夹回边界。
- 今天为空时提示请填今天的实际日期;早于生产日期时提示今天早于生产日,请核对输入。
- 开盖日期与开盖后使用期只填其中一个时,提示指名缺的是哪一个;两个都空则跳过这条线,不报错。
- 按月与按年加减会先算目标年月再取该月天数与原日号的较小值,全程手动夹紧,不用 setMonth。
- 剩余比例保留两位小数;剩余天数出现负数时按「已过期」处理,比例记 0,不再算百分比。
- 33.33 与 20 这两个阈值是常见做法,不是强制规定:各地与连锁超市的要求不一致,中国没有全国强制统一值。
- 本页不处理时区,日期按纯日期对待,不做小时与分钟的换算。
- 本页不判断食品安全与法律责任,也不代替产品执行标准里对起算口径的具体规定。
- 整页不联网、不写本地存储;导出的 CSV 带字节序标记,复制的文本不带。
常见问题
两种口径到底差几天?
差 1 天。口径 A 认为生产当天算第 1 天,到期日 = 生产日 + 天数 − 1;口径 B 从次日算起。2026-03-01 加 180 天时分别是 2026-08-27 与 2026-08-28。
1 月 31 日加 1 个月会变成几月几日?
2025-02-28。2 月没有 31 日,本页先算目标年月再夹到该月最后一天。用 JS 的 setMonth 会溢出成 3 月 3 日,那是错的。
2024 年 2 月 29 日生产,保质期 12 个月?
2025-02-28。2025 年不是闰年,2 月 29 日的对应日不存在,只能落到 28 日。
按月标注时两种口径还差 1 天吗?
不差。按月与按年走对应日口径,起算日是否计入已经包含在「对应日」里,所以两种口径落在同一天。
为什么看比例而不是看剩余天数?
因为 30 天保质期剩 10 天与 3 年保质期剩 10 天完全不是一回事。按剩余比例:182/274 = 66.42 个百分点、31/43 = 72.09 个百分点,这才可比。
临期与下架的阈值是多少?
常见做法:低于 33.33 个百分点视作临期,低于 20 个百分点通常要求下架或专区销售。各地与连锁超市规定不一,中国没有全国强制统一值,本页只负责算出来。
开盖后的日期怎么算?
从开盖日单独起算,与生产日无关。2026-10-13 开封、12M 得 2027-10-13。两条线取更早的那个。
输入的日期会上传吗?
不会。日期只在本页脚本里参与天数加减,没有发起任何网络请求,也没有写入本地存储。