使用方法
- 在「末次经期首日」选 2026-09-10(页面默认值,即最近一次来潮的第一天);允许 1900-01-01 到 2100-12-31,填未来日期会被拒绝。
- 在「平均周期长度」填 28,单位是自然日,允许 15~60 的整数;超出常规范围 21~35 天不报错,只给黄色提示。
- 在「经期天数」填 5,指首日到结束日含首尾的天数,允许 1~10,且必须小于平均周期。
- 在「黄体期长度」填 14,它决定排卵日落在下次经期首日之前多少天,允许 9~16。
- 在「推演周期数」填 24,按平均周期向后滚动 24 次;表格先渲染 12 行,其余点「加载更多」。
- 点「推算经期日历」,或在任意输入框里裸按 Enter。结果区给出 8 张摘要卡和明细表;点「复制对照表」拿 TSV,「导出 CSV」下载带 BOM 的表格。
这个周期计算器能解决什么
一是排日程。出差、体检、婚礼、考试撞上经期都很麻烦,把两个参数填进去,接下来两年哪几天是经期一目了然。
二是把易孕期先框出来。备孕的人需要的是「哪几天值得重点测」,而不是精确到小时的排卵时刻;这个周期计算器给出排卵日前 5 天到后 1 天共 7 天的窗口。
三是判断周期是否规律。把平均周期填成 28、30、35 分别看结果怎么变:按记录算出的平均值落在 21~35 天之外时会亮黄条,这就是该去看医生的信号。
四是做两次记录之间的比对。记下推算出的下次经期,真正来潮后再填一次,两次的日期差就是你周期的漂移量。周期为 7 的整数倍(21、28、35)时经期首日始终落在同一个星期几。
本页不做这些事:不预测排卵的具体时刻、不做孕期推算、不管理经期症状、不给避孕建议。
原理和变量:日历法、黄体期与 UTC 日期算术
① 用的是哪个公式。这个周期计算器实现的是日历法(calendar-based method,又称 Ogino–Knaus 法,由日本医生荻野与奥地利医生 Knaus 在 20 世纪 20~30 年代提出)。三条公式只有一行:第 k 个周期的经期首日 = 末次经期首日 + (k−1) × 平均周期长度;第 k 个周期的预计排卵日 = 该周期首日 + 平均周期长度 − 黄体期长度;易孕期窗口 = 排卵日 − 5 天 到 排卵日 + 1 天。本页不引第三方日期库,运算由 Date.UTC() 建毫秒基准、再用 t + n * 86400000 推进。
② 关键参数为什么取这些值。黄体期默认 14 天:卵泡期长短因人而异,黄体期却相对稳定在 12~16 天,取中位 14 天作固定假设是日历法的标准做法;把它做成可调输入(9~16),是因为这个假设直接决定排卵日——从 12 改到 16,排卵日就前后挪 4 天。平均周期默认 28 天只是人群均值,所以输入放宽到 15~60。经期天数默认 5 天,临床常见 3~7 天。
③ 遵循什么标准。日期表示遵循 ISO 8601 的 YYYY-MM-DD 扩展格式与公历规则,跨月、跨年、闰年全交给 UTC 毫秒运算自动进位。周期长度的常规区间采用 ACOG(美国妇产科医师学会)第 651 号委员会意见《Menstruation in Girls and Adolescents》的界定:正常月经周期 21~35 天。本页只拿这个区间做提示,不改变计算结果。
④ 输入是怎么变成输出的。「2026-09-10」先用正则 /^(\d\d\d\d)-(\d\d)-(\d\d)$/ 拆成年月日,再用 Date.UTC(y, m-1, d) 得到毫秒基准,并用回读校验剔除非法日期(如 2026-02-30)。第 k 个周期的首日 = 基准毫秒 + (k−1) × 周期 × 86400000;排卵日 = 该首日 + (周期 − 黄体期) × 86400000;易孕期 = 排卵日 − 5×86400000 到 + 1×86400000。星期几用 (new Date(t).getUTCDay() + 6) % 7 + 1 换成 ISO 周内序号(1 = 周一);「距今天数」= Math.round((目标毫秒 − 今天UTC零点) / 86400000)。
⑤ 边界与阈值。平均周期 15~60 天(常规 21~35);经期 1~10 天且必须小于平均周期;黄体期 9~16 天;推演周期数 1~24;末次经期首日不得晚于今天。推满 24 个周期、周期 28 天时,最后首日距末次首日 644 天,约 1.76 年;易孕期窗口固定 7 天。
⑥ 最常见的误用:把排卵日当成「周期第 14 天」。这是把 28 天周期的特例当通用规律。本页的排卵日由下次经期首日往回减黄体期得到:周期 28 天时是第 15 天(首日算第 1 天,即 2026-09-24),周期 21 天时是第 8 天(2026-09-17),周期 35 天时是第 22 天(2026-10-01)。周期越长排卵日越靠后,「第 14 天」只对 28 天周期成立;说第 14 天的人是把首日记作第 0 天,同一件事的两种记法差了 1。
完整示例(数值仅作演示)
示例条件就是周期计算器页面打开时的默认值:末次经期首日 2026-09-10、平均周期 28 天、经期 5 天、黄体期 14 天、推演 24 个周期。逐项算出来的结果是:
- 本次经期区间 2026-09-10 ~ 2026-09-14,含首尾共 5 天;
- 下次经期首日 2026-10-08(周四),正是末次首日往后 28 天,因为 28 = 4 × 7 所以星期几不变;
- 下次经期区间 2026-10-08 ~ 2026-10-12;
- 本周期预计排卵日 2026-09-24(周四),即 2026-10-08 往前减 14 天;
- 本周期易孕期窗口 2026-09-19 ~ 2026-09-25,共 7 天;
- 以 2026-10-01 为参考日,它落在周期第 22 天,距下次经期首日还有 7 天;
- 第 12 个周期首日是 2027-07-15(距首日 308 天),第 24 个是 2028-06-15(距首日 644 天,约 1.76 年)。
把 24 个周期列全,会看到从 2026-09-10 起清一色都是周四:28 天是 7 的整数倍,星期几被锁死了。若把平均周期改成 30 天(对 7 取模为 2),经期首日每往后一个周期就比上一周期晚 2 个星期几;改成 25 天(取模为 4)则每周期后挪 4 天。这就是「上个月周三来、这个月变成周六」的原因——不是周期乱了,而是周期长度不是 7 的倍数。
下表固定末次经期首日为 2026-09-10,只改「平均周期长度」,可以看出这一个变量如何同时把下次经期和排卵日往后推:
| 平均周期 | 下次经期首日 | 星期 | 距末次首日 | 预计排卵日 | 排卵日在周期第几天 | 易孕期窗口 |
|---|---|---|---|---|---|---|
| 21 天 | 2026-10-01 | 周四 | 21 天 | 2026-09-17 | 第 8 天 | 2026-09-12 ~ 09-18 |
| 25 天 | 2026-10-05 | 周一 | 25 天 | 2026-09-21 | 第 12 天 | 2026-09-16 ~ 09-22 |
| 28 天(默认) | 2026-10-08 | 周四 | 28 天 | 2026-09-24 | 第 15 天 | 2026-09-19 ~ 09-25 |
| 30 天 | 2026-10-10 | 周六 | 30 天 | 2026-09-26 | 第 17 天 | 2026-09-21 ~ 09-27 |
| 35 天 | 2026-10-15 | 周四 | 35 天 | 2026-10-01 | 第 22 天 | 2026-09-26 ~ 10-02 |
最值得注意的是最右两列:周期从 21 天拉到 35 天,下次经期首日只差 14 天,但排卵日在周期里的位置从第 8 天一路挪到第 22 天。周期长度的影响几乎全落在排卵日上,这正是「用第 14 天估排卵日」在长周期身上失效的原因。
输入范围与对照表
五个输入项的取值范围、默认值和越界行为如下。「越界行为」一列很关键:报错会清空结果区并红字说明,提示则照常计算、只给黄色提醒。
| 输入项 | 允许范围 | 默认值 | 越界行为 |
|---|---|---|---|
| 末次经期首日 | 1900-01-01 ~ 2100-12-31,且不得晚于今天 | 2026-09-10 | 报错:空值、非法日期(如 2026-02-30)、未来日期 |
| 平均周期长度 | 15~60 天的整数 | 28 | 报错:小数、字母、空值、超出 15~60;落在 21~35 之外仅提示 |
| 经期天数 | 1~10 天的整数,且必须小于平均周期 | 5 | 报错:小于 1、大于 10、大于或等于平均周期 |
| 黄体期长度 | 9~16 天的整数 | 14 | 报错:小数、空值、超出 9~16 |
| 推演周期数 | 1~24 个周期 | 24 | 报错:小于 1、大于 24、小数、空值 |
下面这张表固定平均周期 28 天、下次经期首日 2026-10-08 不变,只改「黄体期长度」,可以回答一个常被问到的问题:不同工具算出的排卵日为什么差两三天——差的就是黄体期这个假设。
| 黄体期长度 | 预计排卵日 | 星期 | 易孕期窗口 | 与 14 天基准的差 |
|---|---|---|---|---|
| 9 天 | 2026-09-29 | 周二 | 2026-09-24 ~ 09-30 | 晚 5 天 |
| 12 天 | 2026-09-26 | 周六 | 2026-09-21 ~ 09-27 | 晚 2 天 |
| 14 天(默认) | 2026-09-24 | 周四 | 2026-09-19 ~ 09-25 | 基准 |
| 16 天 | 2026-09-22 | 周二 | 2026-09-17 ~ 09-23 | 早 2 天 |
结果边界与舍入
本页的输出全部是整天,没有任何小数。下面几件事决定了这个结果能信到什么程度:
- 日期算术一律走 UTC。本地时间「加 1 天」遇夏令时切换会变成 23 或 25 小时,跨几次就整体错一天;UTC 里每天恒为 86400000 毫秒。这也让「距今天数」可以用
Math.round():两端都是 UTC 零点,差值必是整天的整数倍。 - 平均周期只收整数,四舍五入会累积。记录平均 27.4 天要填 27,到第 12 个周期偏 4.4 天;28.3 填 28 偏 3.3 天;29.6 填 30 偏 −4.4 天。想减小这项误差,就调小推演周期数,并定期用真实来潮日重填末次经期首日。
- 黄体期固定 14 天,自带 ±2 天误差。真实黄体期在 12~16 天波动,排卵日随之前后挪最多 2 天;易孕期窗口取 7 天宽,本身就是为这项不确定性留的余量。
- 周期在 21~35 天之外只提示、不算错。超区间时结果照常输出但会亮黄条——压力、跨时区飞行、短期用药都会临时改变周期,这不是判定你有问题。
- 推得越远越不该当真。周期 28 天推满 24 个周期跨度 644 天,实际平均值只要偏 1 天,最后一个首日就偏 23 天——把远段当轮廓看。
- 输入不合法时结果整体清空并给出原因:末次首日为空、格式错误或落在未来,周期超出 15~60,经期超出 1~10 或大于等于周期,黄体期超出 9~16,推演周期数超出 1~24。
- 重要声明。本页基于日历法做纯日期推算,全部在浏览器本地完成,不涉及任何检查或诊断;排卵日个体差异、周期不规律、疾病与用药都会让实际日期偏离,结果不构成医学建议,也不能作为避孕依据。
常见问题
为什么这个周期计算器算出的排卵日和别的 App 差一两天?
主要是黄体期假设不同。本页固定 14 天,有的工具用 12 或 13 天,还有的直接取周期的一半。上面的黄体期对照表可以看到,黄体期从 12 改到 16,排卵日就前后挪 4 天。想知道哪种更贴近你,得用排卵试纸或 B 超实测两三个周期来校准。
排卵日到底该记成「周期第 14 天」还是第 15 天?
取决于首日算第几天。本页把末次首日记作第 1 天,28 天周期的排卵日就落在第 15 天(2026-09-24 距首日 14 天);把首日记作第 0 天时,同一件事写成第 14 天。要点是「第 14 天」只对 28 天周期成立,周期 35 天时要再往后推一周。
我的周期不固定,平均值该填多少?
把最近 6 次周期长度相加除以 6,四舍五入填整数;例如 28、29、27、28、30、28 的平均是 28.3,填 28。本页只收整数周期,所以到第 12 个周期会累积偏 3.3 天。波动超过 7~9 天时,固定周期这个假设本身就不太成立,结果只当粗略参考。
推演 24 个周期之后的日期还可信吗?
当轮廓看。24 个周期、周期 28 天跨度 644 天;真实平均只要和填进去的差 1 天,最后一行就偏 23 天。建议只用最近 3~6 个周期安排具体日程,更远的部分看趋势,并在每次真实来潮后重新填一次末次经期首日。
为什么「经期天数」不允许大于或等于「平均周期长度」?
那样在日历法里没有意义——经期和周期一样长就变成「每天都在经期」,相邻两个周期的首日也无从区分。判据是经期天数必须严格小于平均周期,默认 5 天配 28 天周期,经期占整个周期的 17.9%。
易孕期窗口为什么定成 7 天?
它对应生物学上的可行区间:精子在生殖道内最长存活约 5 天,卵子排出后约 24 小时内可受精。窗口取「排卵日前 5 天 + 当天 + 后 1 天」共 7 天,覆盖「精子先等候」和「卵子刚排出」两种情形;窗口内越靠近排卵日,受孕概率越高。
用这个结果来避孕靠谱吗?
不靠谱,本页不支持这种用法。日历法的前提是周期极其规律、排卵日可预知,而真实排卵日常因压力、疾病、跨时区、短期用药而提前或推后,一次偏差就能让「安全期」失效。避孕请使用专门的方式并咨询医生。
换个时区打开,算出来的日期会变吗?跨过夏令时会错一天吗?
都不会。日期运算全部基于 Date.UTC() 的毫秒值,输入在解析时就被固定成 UTC 零点,之后每次固定加 86400000 毫秒,与所在时区、当地是否实行夏令时完全无关。只有「距今天数」一列随真实当天变化。