备孕窗口推算
备孕三个月没中,医生建议监测排卵时间。但月经周期不规律,28 天和 35 天交替出现,按固定周期算排卵日总对不上。把过去 6 个月经期记录输入工具,系统自动算出最长和最短周期,并标记出排卵窗口的波动范围。发现实际易孕期比 App 默认的 5 天多出 2 天,调整同房频率后次月成功受孕。
翻开日历标记经期,三个月后想回顾规律,却发现纸页上只有零散的圈和叉。这个工具把日期输入变成一张连续周期表,自动计算每轮间隔、持续天数,并标出最短与最长周期。所有数据留在浏览器里,不会传到任何服务器——适合正在观察周期、备孕或单纯想了解身体节奏的人,把模糊的直觉变成可读的记录。
备孕三个月没中,医生建议监测排卵时间。但月经周期不规律,28 天和 35 天交替出现,按固定周期算排卵日总对不上。把过去 6 个月经期记录输入工具,系统自动算出最长和最短周期,并标记出排卵窗口的波动范围。发现实际易孕期比 App 默认的 5 天多出 2 天,调整同房频率后次月成功受孕。
下周三要飞 12 小时去欧洲谈客户,但按上月周期推算,那几天正好是经期第二天——痛经最重的时候。改签航班要多花 3000 块,不改又怕在谈判桌上脸色发白。把近 4 个月周期数据输进工具,发现平均周期是 31 天,比预想的晚 3 天,实际经期正好落在返程那天。按这个结果调整了止痛药服用时间,出差顺利完成。
公司规定每月可请 1 天痛经假,但需要提供经期证明。行政要求至少连续 3 个月的记录才认可。之前零散记在手机备忘录里,无法形成有效证据链。把过去 5 个月的日期整理输入工具,生成了一张带时间轴的周期表,清晰显示每次经期持续 5-6 天、痛经集中在第 1-2 天。打印出来交给人事,当天就批了假。
因为经期出血量突然增大,挂了第二天的妇科号。医生问「最近三个月周期分别是多少天」「出血几天」「有没有非经期出血」,当场回忆根本说不清。把手机里零散的记录输入工具,导出 6 个月的周期趋势图,发现周期从 28 天逐步缩短到 24 天,且经期从 5 天延长到 7 天。医生根据这个趋势开了激素六项检查,确诊了黄体功能不足。
跟着线上健身课练高强度间歇训练,但每到经期前一周就特别累,深蹲重量上不去还容易受伤。教练建议根据周期调整训练计划。把经期日期输入工具,系统自动标出未来 3 个月的经期和排卵期。在黄体期(经前 7 天)把 HIIT 换成瑜伽和慢跑,卵泡期(经后 7 天)再恢复大重量训练。连续执行两个月后,经前综合征的疲劳感明显减轻。
| 维度 | 本工具 | 经期记录 App (如 Clue) | 纸质日历/手写 |
|---|---|---|---|
| 隐私 | 数据仅浏览器本地处理,不上传服务器 | 需注册账号,数据存云端 | 完全离线,无数字痕迹 |
| 离线可用 | 打开页面即可用,无需网络 | 多数需联网同步 | 始终可用 |
| 长期连续性 | 自动生成连续 N 个月周期表,无需逐日录入 | 需每日打卡,漏记则数据不完整 | 需手动翻日历推算,易断档 |
| 周期预测 | 基于输入日期自动计算下次经期、排卵期 | 有算法预测,但依赖历史数据量 | 无预测功能,全靠人工估算 |
| 成本 | 免费,无内购 | 基础免费,高级功能需订阅 | 仅需纸笔,零成本 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 开始日期:2024-01-01,周期长度:28天,经期长度:5天,显示月数:6 | 2024-01-01 ~ 2024-01-05 2024-01-29 ~ 2024-02-02 2024-02-26 ~ 2024-03-01 2024-03-25 ~ 2024-03-29 2024-04-22 ~ 2024-04-26 2024-05-20 ~ 2024-05-24 | 常规:28天标准周期,验证连续6个月推算是否正确,注意跨月(1月→2月)和闰年2月天数处理 |
| 开始日期:2023-02-28,周期长度:30天,经期长度:4天,显示月数:3 | 2023-02-28 ~ 2023-03-03 2023-03-30 ~ 2023-04-02 2023-04-29 ~ 2023-05-02 | 边界:开始日期为2月28日(非闰年),经期跨月时2月只有28天,验证工具是否正确处理2月天数不足时的日期滚动 |
| 开始日期:2024-02-29,周期长度:28天,经期长度:3天,显示月数:2 | 2024-02-29 ~ 2024-03-02 2024-03-28 ~ 2024-03-30 | 边界:开始日期为闰年2月29日,验证工具对闰年特殊日期的处理,以及后续周期是否正常推算 |
| 开始日期:2024-06-15,周期长度:35天,经期长度:7天,显示月数:4 | 2024-06-15 ~ 2024-06-21 2024-07-20 ~ 2024-07-26 2024-08-24 ~ 2024-08-30 2024-09-28 ~ 2024-10-04 | 常规:长周期(35天)和长经期(7天),验证经期跨月(9月→10月)时日期连续性 |
| 开始日期:2024-12-25,周期长度:28天,经期长度:5天,显示月数:3 | 2024-12-25 ~ 2024-12-29 2025-01-22 ~ 2025-01-26 2025-02-19 ~ 2025-02-23 | 边界:开始日期接近年底,验证跨年(2024→2025)时年份切换是否正确,以及次年2月天数处理 |
| 开始日期:2024-03-01,周期长度:21天,经期长度:3天,显示月数:5 | 2024-03-01 ~ 2024-03-03 2024-03-22 ~ 2024-03-24 2024-04-12 ~ 2024-04-14 2024-05-03 ~ 2024-05-05 2024-05-24 ~ 2024-05-26 | 易错:极短周期(21天),一个月内可能出现两次经期(如5月3日和5月24日),验证工具是否正确显示密集周期 |
| 开始日期:2024-07-01,周期长度:28天,经期长度:1天,显示月数:2 | 2024-07-01 ~ 2024-07-01 2024-07-29 ~ 2024-07-29 | 边界:经期长度为1天(最短经期),验证单日经期输出格式是否正确(起止日期相同) |
1.起始日期用农历而非公历
上次来月经是农历三月初五,输入 2025-04-02确认公历日期后再输入,或先查万年历转换经期周期表基于公历日期计算,农历日期与公历每年偏移不同,直接输入农历会导致周期错位。
2.周期长度填成经期天数
每次来 5 天,周期填 5周期填 28(从本次第 1 天到下次第 1 天的间隔天数)周期 = 相邻两次月经第 1 天的间隔天数(通常 21-35 天),经期天数(出血天数)是另一个概念,两者混淆会导致预测完全错误。
3.只输入单次日期就查看预测
只输入 2025-03-01,点击生成至少连续输入 3 次以上起始日期,或同时填入平均周期长度单次日期无法计算周期规律,工具需要至少 2 个周期(3 次起始日)才能推算平均周期,否则只能按默认 28 天粗略估算。
4.把非经期出血当作经期起始日
排卵期有褐色分泌物,也记成经期第 1 天只把正常月经量(需用卫生巾)的第 1 天作为起始日排卵期出血、着床出血等非经期出血量少且时间短,混入会导致周期长度计算失真,预测结果偏离实际。
5.周期长度填成固定值,忽略个体波动
明明周期 26-32 天波动,却固定填 28输入最近 3-6 个月的实际起始日期,让工具自动计算平均周期女性周期存在正常波动(±7 天),固定值会掩盖真实规律,多输入历史数据才能得到更准的预测窗口。
6.跨年时月份序号写错
2024-12-28 之后的下一次想写 2025-01-25,写成 2025-13-25月份用 01-12,跨年时注意月份从 01 重新开始日期格式严格遵循 YYYY-MM-DD,月份超过 12 或日期超过当月天数时工具会报错或解析失败。
7.服药期间不调整输入数据
开始吃短效避孕药后,仍按以前的自然周期日期输入服药期间按撤药性出血日期输入,或单独记录服药周期激素类药物会改变月经周期规律,继续按自然周期输入会导致预测完全失准,建议在备注中标注用药状态。
下次月经日 = 本次月经首日 + 平均周期长度
本次月经首日最近一次月经开始日期平均周期长度过去6个月周期天数的平均值最近一次月经首日为2025年3月1日,过去6个月周期长度分别为28、30、29、31、28、30天,平均周期长度 = (28+30+29+31+28+30)÷6 = 176÷6 ≈ 29.33天,取整29天。下次月经日 = 2025年3月1日 + 29天 = 2025年3月30日。
6 种主流语言实现,复制即用:
from datetime import datetime, timedelta
def predict_periods(last_start: str, cycle_len: int, period_len: int, months: int):
"""
预测未来 N 个月的经期日期
last_start: 末次月经开始日, 格式 'YYYY-MM-DD'
cycle_len: 周期天数 (21-35)
period_len: 经期天数 (3-7)
months: 预测月数
"""
start = datetime.strptime(last_start, '%Y-%m-%d')
results = []
for _ in range(months):
end = start + timedelta(days=period_len - 1)
results.append((start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d')))
start += timedelta(days=cycle_len)
return results
# 示例:末次月经 2024-01-01,周期 28 天,经期 5 天,预测 3 个月
print(predict_periods('2024-01-01', 28, 5, 3))
# 输出: [('2024-01-01', '2024-01-05'), ('2024-01-29', '2024-02-02'), ('2024-02-26', '2024-03-01')]/**
* 预测未来 N 个月的经期日期(纯函数,无副作用)
* @param {string} lastStart - 末次月经开始日 'YYYY-MM-DD'
* @param {number} cycleLen - 周期天数
* @param {number} periodLen - 经期天数
* @param {number} months - 预测月数
* @returns {Array<[string, string]>} 起始日与结束日数组
*/
function predictPeriods(lastStart, cycleLen, periodLen, months) {
const start = new Date(lastStart);
const results = [];
for (let i = 0; i < months; i++) {
const end = new Date(start);
end.setDate(end.getDate() + periodLen - 1);
const fmt = (d) => d.toISOString().slice(0, 10);
results.push([fmt(start), fmt(end)]);
start.setDate(start.getDate() + cycleLen);
}
return results;
}
console.log(predictPeriods('2024-01-01', 28, 5, 3));
// 输出: [ [ '2024-01-01', '2024-01-05' ], [ '2024-01-29', '2024-02-02' ], [ '2024-02-26', '2024-03-01' ] ]package main
import (
"fmt"
"time"
)
// PredictPeriods 预测未来 N 个月的经期
func PredictPeriods(lastStart string, cycleLen, periodLen, months int) ([]struct{ Start, End string }, error) {
start, err := time.Parse("2006-01-02", lastStart)
if err != nil {
return nil, err
}
type Period struct{ Start, End string }
results := make([]Period, 0, months)
for i := 0; i < months; i++ {
end := start.AddDate(0, 0, periodLen-1)
results = append(results, Period{start.Format("2006-01-02"), end.Format("2006-01-02")})
start = start.AddDate(0, 0, cycleLen)
}
return results, nil
}
func main() {
periods, err := PredictPeriods("2024-01-01", 28, 5, 3)
if err != nil {
fmt.Println("Error:", err)
return
}
for _, p := range periods {
fmt.Printf("%s ~ %s\n", p.Start, p.End)
}
// 输出:
// 2024-01-01 ~ 2024-01-05
// 2024-01-29 ~ 2024-02-02
// 2024-02-26 ~ 2024-03-01
}use chrono::NaiveDate;
/// 预测未来 N 个月的经期日期
fn predict_periods(
last_start: &str,
cycle_len: i64,
period_len: i64,
months: usize,
) -> Result<Vec<(String, String)>, chrono::ParseError> {
let start = NaiveDate::parse_from_str(last_start, "%Y-%m-%d")?;
let mut results = Vec::with_capacity(months);
let mut cur = start;
for _ in 0..months {
let end = cur + chrono::Duration::days(period_len - 1);
results.push((cur.to_string(), end.to_string()));
cur += chrono::Duration::days(cycle_len);
}
Ok(results)
}
fn main() {
match predict_periods("2024-01-01", 28, 5, 3) {
Ok(periods) => {
for (s, e) in &periods {
println!("{} ~ {}", s, e);
}
// 输出:
// 2024-01-01 ~ 2024-01-05
// 2024-01-29 ~ 2024-02-02
// 2024-02-26 ~ 2024-03-01
}
Err(e) => eprintln!("解析日期出错: {}", e),
}
}/**
* 预测经期(类型安全版本)
*/
function predictPeriods(
lastStart: string,
cycleLen: number,
periodLen: number,
months: number
): [string, string][] {
const start = new Date(lastStart);
const results: [string, string][] = [];
for (let i = 0; i < months; i++) {
const end = new Date(start);
end.setDate(end.getDate() + periodLen - 1);
const fmt = (d: Date) => d.toISOString().slice(0, 10);
results.push([fmt(start), fmt(end)]);
start.setDate(start.getDate() + cycleLen);
}
return results;
}
console.log(predictPeriods('2024-01-01', 28, 5, 3));
// 输出: [ [ '2024-01-01', '2024-01-05' ], [ '2024-01-29', '2024-02-02' ], [ '2024-02-26', '2024-03-01' ] ]import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
public class PeriodPredictor {
/**
* 预测未来 N 个月的经期
* @param lastStart 末次月经开始日 (yyyy-MM-dd)
* @param cycleLen 周期天数
* @param periodLen 经期天数
* @param months 预测月数
* @return 起始日与结束日列表
*/
public static List<String[]> predict(String lastStart, int cycleLen, int periodLen, int months) {
LocalDate start = LocalDate.parse(lastStart);
List<String[]> results = new ArrayList<>();
for (int i = 0; i < months; i++) {
LocalDate end = start.plusDays(periodLen - 1);
results.add(new String[]{start.toString(), end.toString()});
start = start.plusDays(cycleLen);
}
return results;
}
public static void main(String[] args) {
List<String[]> periods = predict("2024-01-01", 28, 5, 3);
for (String[] p : periods) {
System.out.println(p[0] + " ~ " + p[1]);
}
// 输出:
// 2024-01-01 ~ 2024-01-05
// 2024-01-29 ~ 2024-02-02
// 2024-02-26 ~ 2024-03-01
}
}工具基于「平均周期天数」推算,对周期规律(误差≤3天)的用户准确度较高;如果周期波动大(如 25-40 天),预测日期只是参考,建议结合体温或试纸确认排卵。输入时可用最近 3-6 个月的实际记录让均值更准,工具不会自行修正异常值。
工具默认周期为 28 天,如果你实际周期不是 28 天,需要在「周期天数」输入框手动改。例如你记录 30 天一轮,但没改数字,工具仍按 28 天算,结果自然对不上。改完后点「重新计算」即可同步。
本工具支持连续 N 个月,上限是 12 个月(一年)。输入起始日期后,在「月份数」字段填 6 就能看到半年周期表。超出 12 个月会提示超限,不会报错也不强制,建议需要更长时间线的用户分两次查。
不会。工具是纯浏览器端(FE)计算,所有输入数据只在你的浏览器内存里运算,关闭页面或刷新后数据自动清除。不会发到任何服务器,也不存 cookie 或 localStorage,隐私敏感用户可以放心用。
表格列数多(每月一行,每行包含日期、周期天数、预计经期等),小屏手机横屏观看体验更好。建议开启手机浏览器「自动旋转」后横握,或缩小页面显示比例。工具本身没有响应式缩放按钮,但主流浏览器双指缩放都支持。
工具按「下次月经日往前推 14 天」的通用公式估算排卵日,适合周期规律者粗筛。如果排卵试纸或体温显示差异大,说明你的黄体期长度不是标准 14 天,工具无法知道你的实际激素水平。建议把工具当参考,备孕时搭配试纸或 B 超监测。
页面没有单独的「重置」按钮,最简单的做法是直接刷新浏览器页面(F5 或手势刷新),所有输入框会回到空白状态。或者手动把日期输入框和月份数清空再填新值,工具不会保留历史记录。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。
健康参考提示本工具仅供个人记录与生活参考,不能代替医生诊断或专业医疗建议。如有健康疑虑或持续不适,请咨询医生或前往医院就诊。