信用卡还款日计算
每月工资 15 号发,但信用卡账单日和还款日相隔 20 天,记混了就容易逾期。用这个工具输入账单日(如每月 5 号)和还款日(如每月 25 号),直接算出两个日期之间的间隔天数。把结果设成手机日历提醒,再也不用担心记错日期多付利息。
合同到期日、项目截止日、账期起止日……两日期之间的精确差,手动数日历常出错,尤其跨月跨年。输入起始与结束日期,工具直接输出天、周、月、年四种单位的结果,月差按日历月整月计算,年差同理。所有计算在浏览器内完成,数据不上传服务器,可放心粘贴敏感日期。
每月工资 15 号发,但信用卡账单日和还款日相隔 20 天,记混了就容易逾期。用这个工具输入账单日(如每月 5 号)和还款日(如每月 25 号),直接算出两个日期之间的间隔天数。把结果设成手机日历提醒,再也不用担心记错日期多付利息。
装修公司合同写“工期 60 个自然日”,但实际从 3 月 1 日开工到 5 月 10 日才完工。用工具输入两个日期,算出实际经过天数为 70 天。拿着这个结果找装修公司谈延期赔偿,每超一天按合同价款的千分之一索赔,有理有据。
产品经理要在 6 月 30 日上线新功能,从今天 3 月 1 日开始倒推。用工具分别输入 3 月 1 日和 6 月 30 日,算出间隔 121 天。按 3 周需求评审、6 周开发、4 周测试、2 周灰度发布来拆分,每个阶段截止日期一目了然,避免开发延期导致上线跳票。
申根签证有效期 90 天,但规定在 180 天内累计停留不超过 90 天。用工具输入入境日期(如 2024 年 7 月 1 日)和预计离境日期(如 2024 年 8 月 15 日),算出停留 45 天。再往前推 180 天,检查之前是否有过入境记录,确保总停留不超限,避免被海关拒绝入境。
租房合同签了 1 年,从 2024 年 1 月 1 日到 2024 年 12 月 31 日。用工具输入两个日期,算出正好 365 天。提前 30 天(11 月 1 日)设置提醒,这时候跟房东谈续租还是找新房,时间上完全来得及,避免临时仓促搬家。
| 维度 | 本工具 | 在线日期计算器 | 手工计算 |
|---|---|---|---|
| 隐私 | 纯浏览器计算,数据不出本地 | 需上传日期到对方服务器 | 完全离线,无数据外传 |
| 速度 | 输入即出结果,毫秒级响应 | 依赖网络,受页面加载影响 | 需手动数日历或心算,分钟级 |
| 离线可用 | 支持,加载后断网仍可计算 | 不可用,必须联网 | 完全离线 |
| 单位覆盖 | 天/周/月/年差,含跨年/闰年处理 | 多数只支持天差,月年需手动换算 | 仅天差可数,月年差需查表 |
| 批量计算 | 不支持批量,单次一对日期 | 部分支持批量输入(需注册) | 完全手工,一次一对 |
| 收费 | 免费,无隐藏付费 | 基础免费,高级功能(如批量/导出)需会员 | 免费(纸笔/日历成本) |
| 输入 | 输出 | 说明 |
|---|---|---|
| 2024-01-01 至 2024-12-31 | 相差 365 天(52 周 1 天,12 个月,1 年) | 常规:完整平年,验证天、周、月、年四种单位的正确换算 |
| 2023-03-01 至 2023-03-01 | 相差 0 天(0 周,0 个月,0 年) | 边界:同一天,检查零值输出是否合理,避免出现负数或空串 |
| 2024-02-29 至 2025-02-28 | 相差 365 天(52 周 1 天,11 个月 28 天,1 年) | 边界:闰日跨年,月差计算因 2 月天数不同易产生歧义,需验证算法 |
| 2000-01-01 至 2099-12-31 | 相差 36524 天(5217 周 5 天,1199 个月,99 年) | 边界:跨世纪长区间,测试大数值溢出与闰年累积误差 |
| 2023-01-31 至 2023-02-28 | 相差 28 天(4 周,0 个月 28 天,0 年) | 易错:月末对月末,月差容易误解为 1 个月(实际不足整月),需明确输出单位 |
| 2024-06-15 至 2024-06-15 23:59:59 | 相差 0 天(0 周,0 个月,0 年) | 易错:用户可能误以为包含时间差,本工具仅按日期计算,忽略时分秒 |
| 2025-01-01 至 2024-12-31 | 相差 1 天(0 周 1 天,0 个月 1 天,0 年) | 易错:结束日期早于开始日期,检查是否返回绝对值或提示顺序错误 |
1.日期格式混用,工具无法识别
2024/1/52024-01-05工具严格按 ISO 8601 标准(YYYY-MM-DD)解析输入,斜杠或缺少前导零会导致解析失败或结果异常。
2.结束日期早于开始日期,结果出现负数
开始日期填 2024-12-01,结束日期填 2024-11-01开始日期填 2024-11-01,结束日期填 2024-12-01工具按结束减开始的顺序计算,颠倒顺序会得到负值。如需正数结果,应始终将较早日期设为开始日期。
3.跨月天数差理解偏差,误以为固定 30 天
计算 2024-01-15 到 2024-02-15 的天数差,预期 30 天实际结果为 31 天(1 月有 31 天)天数差按实际日历日计算,不是按 30 天/月折算。1 月 15 日到 2 月 15 日跨越了完整的 1 月 31 天区间。
4.闰年 2 月 29 日被当作无效日期
输入 2023-02-292023 年不是闰年,应输入 2023-02-28 或 2024-02-29公历闰年规则:能被 4 整除但不能被 100 整除,或能被 400 整除。2023 年不满足条件,2 月只有 28 天。
5.月差结果误解为整月数,忽略剩余天数
2024-01-15 到 2024-03-10 的月差,认为结果是 2 个月实际月差为 1 个月零 24 天(工具会同时显示月数和剩余天数)月差计算只计数完整月份跨度,不足一月的部分以天数显示。1 月 15 日到 3 月 15 日才满 2 个月,提前到 3 月 10 日只有 1 个月。
6.年差忽略闰日影响,直接除 365
认为 2020-03-01 到 2021-03-01 是 365 天实际为 366 天(2020 年是闰年,包含 2 月 29 日)年差按实际跨越的日历天数计算,不是简单除以 365。闰年多出的 2 月 29 日会计入总天数。
7.周差计算时,把不足 7 天的部分算作 1 周
2024-01-01 到 2024-01-05,认为周差是 1 周实际周差为 0 周(仅 4 天,不足 7 天)周差只统计完整的 7 天周期。不足 7 天的零头天数会被单独显示,不会向上取整。
8.时间部分被忽略,导致日期边界判断错误
认为 2024-01-01 23:59 到 2024-01-02 00:01 是 1 天差工具只处理日期部分(忽略时分秒),所以这两个日期差为 1 天工具输入字段仅接受日期,不包含时间。所有日期按 00:00:00 处理,所以同一天的不同时刻也被视为同一天。
天数差 = |D2 - D1|,月数差 = (Y2 - Y1) × 12 + (M2 - M1) + (D2 ≥ D1 ? 0 : -1),年数差 = floor(月数差 / 12),周数差 = floor(天数差 / 7)
D1, D2起始日和结束日,公历日期Y1, Y2起始年和结束年M1, M2起始月和结束月天数差两日期间隔的绝对天数月数差整月数,不足整月舍去年数差整年数,向下取整周数差整周数,向下取整从 2023-03-15 到 2025-07-20:天数差 = |2025-07-20 - 2023-03-15| = 858 天(含闰年 2024 的 366 天);月数差 = (2025-2023)×12 + (7-3) + (20≥15?0:-1) = 24+4+0 = 28 个月;年数差 = floor(28/12) = 2 年;周数差 = floor(858/7) = 122 周。
5 种主流语言实现,复制即用:
from datetime import date
def date_diff(d1: date, d2: date) -> dict:
delta = d2 - d1
days = delta.days
weeks = days // 7
months = (d2.year - d1.year) * 12 + (d2.month - d1.month)
years = d2.year - d1.year
# 如果结束日期的月日小于起始日期,说明不满整年
if (d2.month, d2.day) < (d1.month, d1.day):
years -= 1
return {"天": days, "周": weeks, "月": months, "年": years}
# 示例:2024-01-15 到 2025-03-20
print(date_diff(date(2024, 1, 15), date(2025, 3, 20)))function dateDiff(d1, d2) {
const msPerDay = 86400000;
const days = Math.round((d2 - d1) / msPerDay);
const weeks = Math.floor(days / 7);
let months = (d2.getFullYear() - d1.getFullYear()) * 12 + (d2.getMonth() - d1.getMonth());
let years = d2.getFullYear() - d1.getFullYear();
if (d2.getMonth() < d1.getMonth() || (d2.getMonth() === d1.getMonth() && d2.getDate() < d1.getDate())) {
years--;
}
return { days, weeks, months, years };
}
// 示例:2024-01-15 到 2025-03-20
console.log(dateDiff(new Date(2024, 0, 15), new Date(2025, 2, 20)));package main
import (
"fmt"
"time"
)
type DateDiff struct {
Days int
Weeks int
Months int
Years int
}
func diff(d1, d2 time.Time) DateDiff {
days := int(d2.Sub(d1).Hours() / 24)
weeks := days / 7
years := d2.Year() - d1.Year()
months := years*12 + int(d2.Month()-d1.Month())
if d2.YearDay() < d1.YearDay() {
years--
}
return DateDiff{Days: days, Weeks: weeks, Months: months, Years: years}
}
func main() {
d1 := time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC)
d2 := time.Date(2025, 3, 20, 0, 0, 0, 0, time.UTC)
fmt.Printf("%+v\n", diff(d1, d2))
}#!/bin/bash
# 依赖 dateutils(Linux 包管理器安装)
d1="2024-01-15"
d2="2025-03-20"
days=$(datediff "$d1" "$d2")
weeks=$((days / 7))
months=$(datediff -f '%m' "$d1" "$d2")
years=$(datediff -f '%y' "$d1" "$d2")
echo "天: $days, 周: $weeks, 月: $months, 年: $years"import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DateDiff {
public static void main(String[] args) {
LocalDate d1 = LocalDate.of(2024, 1, 15);
LocalDate d2 = LocalDate.of(2025, 3, 20);
long days = ChronoUnit.DAYS.between(d1, d2);
long weeks = days / 7;
long months = ChronoUnit.MONTHS.between(d1, d2);
long years = ChronoUnit.YEARS.between(d1, d2);
System.out.printf("天: %d, 周: %d, 月: %d, 年: %d%n", days, weeks, months, years);
}
}不同场景下“天数差”的定义不一样。本工具默认按“日期差”计算,即从开始日0点到结束日0点之间的完整天数,不包含结束日当天。例如1月1日到1月2日,结果是1天。如果你需要计算“包含起止日”的天数(比如算请假天数),请手动+1。结果区会明确标注计算方式,避免歧义。
月数差有两种常见算法:按“月历”算(比如1月15日到2月14日算1个月)和按“30天固定值”算。本工具采用前者,即基于实际月份边界,不满一个月的部分按天数单独显示。例如1月31日到2月28日,月差为0个月28天,而不是1个月。如果你需要固定30天/月的商业计算,可以手动用天数除以30。
目前仅支持公历(阳历)日期。农历日期因为闰月、大小月不固定,无法直接用公历算法计算间隔。建议先将农历日期转换为公历(网上有农历转公历工具),再用本工具计算。未来是否会支持农历取决于用户需求反馈。
本工具接受最常见的日期格式:YYYY-MM-DD(如2024-03-15)和YYYY/MM/DD(如2024/03/15)。不支持带中文的格式(如2024年3月15日)、点分格式(2024.3.15)或省略年份的格式(03-15)。如果粘贴的日期来自Excel或数据库,请先转换为标准格式再输入。
这是按“完整周+剩余天数”的逻辑显示的。8天 = 1周(7天) + 1天,所以显示1周1天。如果你需要的是“向上取整的周数”(比如8天算2周),或者“向下取整”(8天算1周),本工具不提供这种四舍五入模式。结果区会同时展示天数,方便你自己换算。
完全纯前端计算,所有逻辑在浏览器内执行,不会将任何日期数据发送到服务器。关闭页面后数据自动清除。如果你对隐私敏感,甚至可以断网使用——打开页面后断开网络,工具仍然正常工作。
是的,开始日期需要手动填写今天日期。本工具没有“自动填入今天”按钮,因为不同用户对“今天”的时区定义可能不同(比如跨时区用户)。建议用快捷键快速输入:在日期输入框按Ctrl+;(Windows)或Cmd+;(Mac)可自动填入当前日期。
按实际日期计算:2020年2月29日到2021年2月28日,因2021年2月没有29日,系统会按2月28日作为结束日,结果是0年11个月30天(差1天满一年)。这种边界情况在闰年比较常见,结果区会精确显示到天,避免“一年”的模糊表述。
不同应用对“日期差”的定义可能不同。手机日历通常计算“包含起止日的天数差”(比如从1日到3日算3天),而本工具计算的是“经过天数”(1日到3日算2天)。另外,手机日历有时会忽略时间部分,而本工具假设起止日均为0点。建议对比时先确认对方工具的计算规则。
不是bug。本工具允许结束日期早于开始日期,此时结果会显示负数(如-5天),表示“提前了5天”。如果你只需要正数差值,请确保开始日期早于结束日期。如果需要绝对值,可以交换两个日期再算一次。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。