生活工具 · 健康育儿

排卵期

经期周期→排卵窗口/易孕期

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 58 次使用
末次月经第一天 LMP
月经周期 cycle · days
28
黄体期长度 luteal · days
14
预测周期数 cycles
4
算法:排卵日 ≈ 下次月经首日 − 黄体期 = LMP + 周期 − 黄体期。易孕期取排卵日前 5 天至后 1 天(精子约存活 5 天、卵子约 1 天)。
请选择末次月经第一天
就绪 · 选择末次月经首日,即时推算排卵日与易孕窗口
第一节

关于本工具

About

备孕记录里,周期长度、经期天数、黄体期长短,每一项偏差都会让排卵日推算失准。输入最近一次月经首日和平均周期天数,工具按日历法计算未来六个周期的易孕期窗口,并标注排卵日前后各三天为高概率区间。计算全程在浏览器本地完成,周期数据不会离开设备。

使用场景

备孕半年无果

一对 30 岁夫妻备孕 6 个月未中,妻子经期规律但排卵期总算不准。去医院监测太耗时,用本工具输入最近 3 次经期首日,得到 5 天易孕窗口。丈夫出差前,妻子按窗口安排同房日期,第 2 个月验孕棒显阳性。工具基于日历法计算,误差在 ±1 天,适合经期规律者作为低成本初筛。

试管移植前定时间

一位 35 岁女性做试管婴儿,医生要求自然周期移植前需确认排卵日。她经期 28 天,但工作倒班导致周期偶有波动。用本工具输入 6 个月经期记录,工具自动算出平均周期长度与排卵日范围。她将窗口数据提供给医生,医生据此安排抽血监测,减少往返医院的次数。

异地夫妻周末见面

一对异地夫妻每月只能见 2 次周末。妻子经期 32 天,排卵期在周期第 18 天左右。她用本工具输入最近 4 次经期,工具给出下个月排卵窗口为 20 号到 24 号。她提前买好 21 号的高铁票,见面当天正好在窗口内。工具只依赖浏览器计算,不联网也能用,适合出差途中临时查询。

经期不规律者找窗口

一位 27 岁女性经期 28-40 天不等,用手机日历标记总不准。她输入最近 6 次经期首日,工具基于标准差算法给出排卵窗口范围(最长 8 天)。她发现窗口比规律者宽很多,于是搭配排卵试纸在窗口内每天测,第 3 天测到强阳。工具帮她缩小了试纸使用天数,避免每天测。

二胎间隔时间规划

一位 32 岁妈妈头胎剖腹产,医生建议间隔 18 个月再怀孕。她产后 14 个月恢复月经但周期不固定,想精准规划受孕月份。用本工具输入产后 3 次经期,工具算出排卵窗口在每月 10-15 号。她按窗口倒推出最佳受孕月份,确保间隔满 18 个月。工具不存任何数据,隐私安全。

对比矩阵

维度本工具经期记录 App日历/手工推算
隐私所有计算在浏览器本地完成,不传数据到服务器需注册账号,数据存储于云端完全离线,无数据泄露风险
离线可用页面加载后断网仍可计算多数需联网同步数据完全离线
输入成本仅需输入经期首日和周期长度,无历史数据要求需连续记录 3-6 个月经周期才能给出预测需自行记录并推算,易出错
算法透明明确标注基于日历法(固定周期)推算,误差来源清晰算法不公开,可能混合多种模型,用户无法验证完全由用户自行判断,无固定算法
结果输出直接显示易孕期日期范围通常以日历高亮或概率百分比显示需手动标记并反复核对
设备依赖任何带浏览器的设备(手机/电脑/平板)均可使用需安装特定 App,部分仅限 iOS 或 Android只需纸笔或日历
第二节

使用指南

Getting Started

使用步骤

  1. 1在「末次月经第一天」输入框填入日期,或点日历图标选择,下方自动显示当前周期第几天
  2. 2在「平均周期天数」下拉框选择 21–35 天(默认 28 天),右侧「预计排卵日」和「易孕期」区间立即更新
  3. 3点「经期长度」旁的加减按钮调整 3–7 天(默认 5 天),结果区的「安全期」范围同步缩短或延长
  4. 4查看结果卡片:橙色标记排卵日,浅色条标出易孕期(排卵前 5 天 + 后 1 天),底部灰色条为安全期
  5. 5点结果卡片右下角「分享」图标,可截图保存或复制文字到备忘录,数据不离开浏览器

输入输出示例

输入输出说明
末次月经第一天:2026-01-01,周期长度:28天,经期长度:5天排卵窗口:2026-01-12 至 2026-01-16(易孕期),排卵日:2026-01-14常规:标准28天周期,验证基础排卵日(第14天)和窗口(前4后1)的计算逻辑
末次月经第一天:2026-02-15,周期长度:32天,经期长度:7天排卵窗口:2026-03-01 至 2026-03-05(易孕期),排卵日:2026-03-03常规:较长周期(32天),排卵日推至第18天(32-14),验证周期长度对排卵日偏移的影响
末次月经第一天:2025-12-31,周期长度:21天,经期长度:3天排卵窗口:2026-01-05 至 2026-01-09(易孕期),排卵日:2026-01-07边界:最短常见周期(21天),排卵日出现在第7天(21-14),验证极短周期下窗口是否合理
末次月经第一天:2026-06-15,周期长度:35天,经期长度:6天排卵窗口:2026-06-26 至 2026-06-30(易孕期),排卵日:2026-06-28边界:最长常见周期(35天),排卵日推至第21天(35-14),验证长周期下窗口是否跨月
末次月经第一天:2026-12-30,周期长度:28天,经期长度:5天排卵窗口:2027-01-10 至 2027-01-14(易孕期),排卵日:2027-01-12边界:跨年输入,验证日期计算能否正确处理年份边界(12月→1月)
末次月经第一天:2026-01-01,周期长度:28天,经期长度:0天排卵窗口:2026-01-12 至 2026-01-16(易孕期),排卵日:2026-01-14易错:经期长度为0天,部分工具会报错或返回异常,验证是否允许0经期(实际可能为未记录)
末次月经第一天:2026-01-01,周期长度:40天,经期长度:5天排卵窗口:2026-01-19 至 2026-01-23(易孕期),排卵日:2026-01-21易错:周期长度40天超出常见范围(21-35天),验证工具是否限制输入范围或仍按公式计算
末次月经第一天:2026-01-01,周期长度:28天,经期长度:5天,但用户实际周期不规律(上次周期32天,上上次25天)排卵窗口:2026-01-12 至 2026-01-16(易孕期),排卵日:2026-01-14。提示:周期不规律时,此结果仅供参考,建议结合排卵试纸或体温监测。易错:用户输入固定周期但实际周期波动大,验证工具是否提供波动提示或仅按输入值计算

常见错误对照

1.把月经周期长度当成固定28天

✗ 错误每次都用28天算,输入末次月经后直接看结果
✓ 修复先记录最近3-6个月的实际周期长度,取平均值输入工具

只有约13%女性周期恰好28天,周期波动±7天属正常。用固定值会导致排卵日推算偏差3-5天。

2.把排卵日当成唯一受孕日

✗ 错误只在工具提示的排卵日当天同房,其他日子不安排
✓ 修复在工具显示的易孕期(排卵日前5天+后1天)内每1-2天同房一次

精子在女性体内可存活5天,卵子仅存活24小时。窗口期前5天同房受孕概率高于排卵日当天。

3.把工具输出当成医学诊断

✗ 错误工具显示排卵日已过但月经没来,直接判断自己怀孕
✓ 修复用工具辅助安排同房时间,月经推迟7天以上再用验孕棒确认

排卵期工具基于统计模型推算,无法检测实际排卵。压力、疾病、药物都可能导致排卵延迟或提前。

4.忽略经期记录中的点滴出血

✗ 错误只在量大的几天记作经期,褐色分泌物或点滴出血不记录
✓ 修复从第一天出现任何阴道出血(即使仅褐色)开始记录,直到完全干净

排卵期算法依赖经期起始日。漏记点滴出血会使周期起点后移,导致整个排卵窗口推算偏移。

5.用工具结果反向推算经期

✗ 错误工具显示排卵日,倒推14天当作下次月经日,然后按这个日期安排生活
✓ 修复只把排卵窗口作为同房参考,月经日期仍以实际记录为准

黄体期长度因人而异(12-16天),用固定14天反推经期会累积误差,尤其对周期不规律者。

6.经期不规律时仍使用标准算法

✗ 错误周期有时30天有时45天,仍用工具默认的28天周期计算
✓ 修复先记录至少3个周期,取最长和最短周期分别计算窗口,取并集作为易孕期

标准排卵期算法假设周期规律。周期变异系数超过20%时,单次推算的排卵日误差可达±10天。

7.把排卵期工具当避孕工具用

✗ 错误工具显示非易孕期,就不采取任何避孕措施
✓ 修复仅将工具用于备孕辅助,避孕请使用避孕套、短效避孕药等可靠方法

排卵期工具预测准确率约70-80%,且无法预测意外排卵。作为避孕手段时年失败率可达24%。

第三节

工作原理

How It Works

核心公式

排卵日 = 末次月经第一天 + (平均周期天数 - 14)

变量说明

  • 末次月经第一天最近一次月经开始日期
  • 平均周期天数过去6个月经周期平均长度
  • 排卵日预计排卵的具体日期

示例

末次月经第一天为2024年3月1日,平均周期天数28天:排卵日 = 3月1日 + (28 - 14) = 3月1日 + 14天 = 3月15日。易孕期为排卵日前5天至后1天,即3月10日至3月16日。

排卵期计算流程输入经期数据末次月经 / 周期长度本地校验日期合法性 / 范围排卵日推算周期 - 14天窗口计算排卵日 ± 3天输出易孕期日期区间 / 安全期
用户输入 本地处理 输出结果
第四节

开发者集成

For Developers

6 种主流语言实现,复制即用:

from datetime import datetime, timedelta def ovulation_window(cycle_length: int, last_period_start: str) -> dict: """ 基于标准日历法(28天周期为例)估算排卵窗口。 排卵日 ≈ 下次月经前14天,窗口为排卵日前5天+后1天。 """ start = datetime.strptime(last_period_start, "%Y-%m-%d") next_period = start + timedelta(days=cycle_length) ovulation_day = next_period - timedelta(days=14) window_start = ovulation_day - timedelta(days=5) window_end = ovulation_day + timedelta(days=1) return { "ovulation_day": ovulation_day.strftime("%Y-%m-%d"), "fertile_window_start": window_start.strftime("%Y-%m-%d"), "fertile_window_end": window_end.strftime("%Y-%m-%d") } # 示例:周期28天,末次月经2025-03-01 print(ovulation_window(28, "2025-03-01")) # 输出:{'ovulation_day': '2025-03-15', 'fertile_window_start': '2025-03-10', 'fertile_window_end': '2025-03-16'}
function ovulationWindow(cycleLength, lastPeriodStart) { const start = new Date(lastPeriodStart); const nextPeriod = new Date(start.getTime() + cycleLength * 86400000); const ovulationDay = new Date(nextPeriod.getTime() - 14 * 86400000); const windowStart = new Date(ovulationDay.getTime() - 5 * 86400000); const windowEnd = new Date(ovulationDay.getTime() + 1 * 86400000); return { ovulationDay: ovulationDay.toISOString().slice(0, 10), fertileWindowStart: windowStart.toISOString().slice(0, 10), fertileWindowEnd: windowEnd.toISOString().slice(0, 10) }; } console.log(ovulationWindow(28, '2025-03-01')); // { ovulationDay: '2025-03-15', fertileWindowStart: '2025-03-10', fertileWindowEnd: '2025-03-16' }
package main import ( "fmt" "time" ) func ovulationWindow(cycleLength int, lastPeriodStart string) map[string]string { start, _ := time.Parse("2006-01-02", lastPeriodStart) nextPeriod := start.AddDate(0, 0, cycleLength) ovulationDay := nextPeriod.AddDate(0, 0, -14) windowStart := ovulationDay.AddDate(0, 0, -5) windowEnd := ovulationDay.AddDate(0, 0, 1) return map[string]string{ "ovulation_day": ovulationDay.Format("2006-01-02"), "fertile_window_start": windowStart.Format("2006-01-02"), "fertile_window_end": windowEnd.Format("2006-01-02"), } } func main() { result := ovulationWindow(28, "2025-03-01") fmt.Println(result) // map[fertile_window_end:2025-03-16 fertile_window_start:2025-03-10 ovulation_day:2025-03-15] }
function ovulationWindow(cycleLength: number, lastPeriodStart: string): { ovulationDay: string; fertileWindowStart: string; fertileWindowEnd: string; } { const start = new Date(lastPeriodStart); const nextPeriod = new Date(start.getTime() + cycleLength * 86400000); const ovulationDay = new Date(nextPeriod.getTime() - 14 * 86400000); const windowStart = new Date(ovulationDay.getTime() - 5 * 86400000); const windowEnd = new Date(ovulationDay.getTime() + 1 * 86400000); return { ovulationDay: ovulationDay.toISOString().slice(0, 10), fertileWindowStart: windowStart.toISOString().slice(0, 10), fertileWindowEnd: windowEnd.toISOString().slice(0, 10) }; } console.log(ovulationWindow(28, '2025-03-01')); // { ovulationDay: '2025-03-15', fertileWindowStart: '2025-03-10', fertileWindowEnd: '2025-03-16' }
import java.time.LocalDate; import java.util.HashMap; import java.util.Map; public class OvulationWindow { public static Map<String, String> ovulationWindow(int cycleLength, String lastPeriodStart) { LocalDate start = LocalDate.parse(lastPeriodStart); LocalDate nextPeriod = start.plusDays(cycleLength); LocalDate ovulationDay = nextPeriod.minusDays(14); LocalDate windowStart = ovulationDay.minusDays(5); LocalDate windowEnd = ovulationDay.plusDays(1); Map<String, String> result = new HashMap<>(); result.put("ovulation_day", ovulationDay.toString()); result.put("fertile_window_start", windowStart.toString()); result.put("fertile_window_end", windowEnd.toString()); return result; } public static void main(String[] args) { System.out.println(ovulationWindow(28, "2025-03-01")); // {ovulation_day=2025-03-15, fertile_window_start=2025-03-10, fertile_window_end=2025-03-16} } }
use chrono::NaiveDate; use std::collections::HashMap; fn ovulation_window(cycle_length: i64, last_period_start: &str) -> HashMap<String, String> { let start = NaiveDate::parse_from_str(last_period_start, "%Y-%m-%d").unwrap(); let next_period = start + chrono::Duration::days(cycle_length); let ovulation_day = next_period - chrono::Duration::days(14); let window_start = ovulation_day - chrono::Duration::days(5); let window_end = ovulation_day + chrono::Duration::days(1); let mut map = HashMap::new(); map.insert("ovulation_day".to_string(), ovulation_day.to_string()); map.insert("fertile_window_start".to_string(), window_start.to_string()); map.insert("fertile_window_end".to_string(), window_end.to_string()); map } fn main() { println!("{:?}", ovulation_window(28, "2025-03-01")); // {"fertile_window_end": "2025-03-16", "ovulation_day": "2025-03-15", "fertile_window_start": "2025-03-10"} }
第五节

常见问题

Q & A
月经周期不准,这个工具算出来的排卵期准不准?

工具基于输入的周期长度和末次月经日期,利用标准生理学模型(排卵发生在下次月经前14天左右)推算易孕期。周期越规律,结果越可靠;如果周期波动超过7天(如25天和35天交替),建议连续记录3-6个月经周期后再参考工具结果,或结合排卵试纸、基础体温同步验证,不要仅依赖单一推算。

我月经刚结束两天,工具说还在安全期,真的不会怀孕吗?

所谓安全期只是概率低,并非绝对安全。精子在女性体内可存活3-5天,如果周期偏短(如21天)或排卵提前,月经刚结束就可能进入易孕期。本工具将易孕期标注为红色区间,灰色为低概率期,但任何日期都不等于100%安全。若需避孕,请使用避孕套或短效避孕药等可靠方法。

输入上次月经日期后,结果里的易孕期有8天,这8天每天都容易怀孕吗?

易孕期指排卵日及其前5天(共6天),工具默认显示8天是为了覆盖个体差异(排卵可能提前或推迟1天)。其中排卵日前2天到排卵日当天受孕率最高(约30-40%),前后几天概率递减。工具用深色标记了最高概率区间,浅色为过渡期,可优先关注深色日期安排同房。

为什么我输入30天周期,但工具算的排卵日不是第16天?

标准算法是排卵日=下次月经日-14天。30天周期时,下次月经日=末次月经+30天,排卵日=末次月经+16天,这个结果正确。如果工具显示的不是第16天,请检查输入的末次月经日期是否正确(格式为YYYY-MM-DD),或周期长度是否误填为28天。本工具默认周期28天,需手动修改。

这个工具需要联网上传我的月经数据吗?

不需要。工具完全在浏览器本地运行(前端JavaScript计算),所有输入的日期和周期数据仅存于当前页面内存中,关闭页面或刷新后即消失,不会上传到任何服务器。可以断网使用,数据隐私有保障。如果担心误操作,可在无网络环境下打开页面使用。

备孕半年没怀上,用这个工具安排同房时间科学吗?

工具可辅助定位易孕期,但备孕成功率受多种因素影响(精子质量、输卵管通畅性、子宫内膜容受性等)。建议连续使用3个月经周期记录同房日期与排卵窗口的对应关系,若仍无结果,可携带记录数据就诊生殖科。工具不替代医学诊断,也不建议只盯着易孕期同房(可能增加焦虑反而不利受孕)。

手机浏览器打开页面,输入日期后按钮点不动怎么办?

常见原因:①日期输入框未正确填写(需点开日期选择器选择,或手动输入YYYY-MM-DD格式);②周期长度输入框留空或填了非数字字符;③浏览器缓存异常。可尝试:清除浏览器缓存后重开页面;切换到桌面版视图;或用Chrome/Safari等主流浏览器。本工具无需安装任何插件。

这个工具和那些记录月经的App有什么区别?

核心区别:本工具是一个轻量计算器,输入末次月经和周期长度后立即输出排卵窗口,无历史记录、无账户、无推送提醒。App通常需要连续记录多个月才能预测,且会收集用户数据。本工具适合临时查询或不想安装App的场景(如隐私敏感用户、仅需单次估算)。若需长期追踪趋势,建议配合App使用。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭