生活工具 · 健康育儿

经期

经期周期表(连续 N 个月)

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 61 次使用
末次月经第一天 LMP · last period
填本次月经来潮的第一天,是全部推算的基准。
经期天数 period · 3–7 天
单次月经持续出血的天数(通常 3–7 天)。
月经周期长度 cycle · 21–35 天
两次月经第一天的间隔,默认 28 天。
预测月数 months · 连续 N 期
3 12 6
连续推算 N 期的月经日期、日历与各阶段。
请填写末次月经第一天
就绪 · 经期预测基于规律周期估算,仅供参考,非医疗诊断
第一节

关于本工具

About

翻开日历标记经期,三个月后想回顾规律,却发现纸页上只有零散的圈和叉。这个工具把日期输入变成一张连续周期表,自动计算每轮间隔、持续天数,并标出最短与最长周期。所有数据留在浏览器里,不会传到任何服务器——适合正在观察周期、备孕或单纯想了解身体节奏的人,把模糊的直觉变成可读的记录。

使用场景

备孕窗口推算

备孕三个月没中,医生建议监测排卵时间。但月经周期不规律,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 个月周期表,无需逐日录入需每日打卡,漏记则数据不完整需手动翻日历推算,易断档
周期预测基于输入日期自动计算下次经期、排卵期有算法预测,但依赖历史数据量无预测功能,全靠人工估算
成本免费,无内购基础免费,高级功能需订阅仅需纸笔,零成本
第二节

使用指南

Getting Started

使用步骤

  1. 1在「上次经期开始日」输入框选择或键入日期,日历控件自动定位到该月
  2. 2在「周期天数」输入框填入平均周期长度(默认 28 天),下方表格立即生成连续 12 个月的预估日期
  3. 3在「经期天数」输入框填入持续天数(默认 5 天),表格中每个月份对应的日期区间自动高亮
  4. 4点击表格中任意月份行,该行日期区间在页面顶部以进度条形式展示剩余天数

输入输出示例

输入输出说明
开始日期:2024-01-01,周期长度:28天,经期长度:5天,显示月数:62024-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天,显示月数:32023-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天,显示月数:22024-02-29 ~ 2024-03-02 2024-03-28 ~ 2024-03-30边界:开始日期为闰年2月29日,验证工具对闰年特殊日期的处理,以及后续周期是否正常推算
开始日期:2024-06-15,周期长度:35天,经期长度:7天,显示月数:42024-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天,显示月数:32024-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天,显示月数:52024-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天,显示月数:22024-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.服药期间不调整输入数据

✗ 错误开始吃短效避孕药后,仍按以前的自然周期日期输入
✓ 修复服药期间按撤药性出血日期输入,或单独记录服药周期

激素类药物会改变月经周期规律,继续按自然周期输入会导致预测完全失准,建议在备注中标注用药状态。

第三节

工作原理

How It Works

核心公式

下次月经日 = 本次月经首日 + 平均周期长度

变量说明

  • 本次月经首日最近一次月经开始日期
  • 平均周期长度过去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日。

输入起始日期年月日 + 周期天数推算 N 个月逐月累加周期生成周期表经期 / 排卵期 / 安全期日历视图展示经期(红色标记)排卵期(金色标记)
用户输入 本地推算 输出结果 日历展示
第四节

开发者集成

For Developers

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 } }
第五节

常见问题

Q & A
我月经一直不太规律,这个工具能预测准吗?

工具基于「平均周期天数」推算,对周期规律(误差≤3天)的用户准确度较高;如果周期波动大(如 25-40 天),预测日期只是参考,建议结合体温或试纸确认排卵。输入时可用最近 3-6 个月的实际记录让均值更准,工具不会自行修正异常值。

为什么我输入的开始日期和工具算出来的下一周期第一天对不上?

工具默认周期为 28 天,如果你实际周期不是 28 天,需要在「周期天数」输入框手动改。例如你记录 30 天一轮,但没改数字,工具仍按 28 天算,结果自然对不上。改完后点「重新计算」即可同步。

最多能算几个月?我想看半年的行不行?

本工具支持连续 N 个月,上限是 12 个月(一年)。输入起始日期后,在「月份数」字段填 6 就能看到半年周期表。超出 12 个月会提示超限,不会报错也不强制,建议需要更长时间线的用户分两次查。

这个工具是纯前端算的,我的经期记录会上传到服务器吗?

不会。工具是纯浏览器端(FE)计算,所有输入数据只在你的浏览器内存里运算,关闭页面或刷新后数据自动清除。不会发到任何服务器,也不存 cookie 或 localStorage,隐私敏感用户可以放心用。

为什么我手机浏览器打开表格显示不全?

表格列数多(每月一行,每行包含日期、周期天数、预计经期等),小屏手机横屏观看体验更好。建议开启手机浏览器「自动旋转」后横握,或缩小页面显示比例。工具本身没有响应式缩放按钮,但主流浏览器双指缩放都支持。

算出来的排卵期准吗?和排卵试纸结果不一样怎么办?

工具按「下次月经日往前推 14 天」的通用公式估算排卵日,适合周期规律者粗筛。如果排卵试纸或体温显示差异大,说明你的黄体期长度不是标准 14 天,工具无法知道你的实际激素水平。建议把工具当参考,备孕时搭配试纸或 B 超监测。

我输入错了日期,怎么重新开始?

页面没有单独的「重置」按钮,最简单的做法是直接刷新浏览器页面(F5 或手势刷新),所有输入框会回到空白状态。或者手动把日期输入框和月份数清空再填新值,工具不会保留历史记录。

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

健康参考提示本工具仅供个人记录与生活参考不能代替医生诊断或专业医疗建议。如有健康疑虑或持续不适,请咨询医生或前往医院就诊。

选择 打开 +新窗口 esc关闭