在线日期计算器:算两个日期之间的日期间隔有多少天,同时给出「几周零几天」「几年几个月几天」,并按工作日计算分出周一到周五有多少天、周末有多少天;从某一天往后或往前推若干天、周、月、年(月末按该月最后一天钳制),也可以只数工作日;查某一天是星期几、当年第几天、ISO 第几周、当年还剩几天、是不是闰年、这天出生的人今天多少周岁零多少天;另有时间计算一栏,算两个时刻相差多久、时刻加减一段时长(自动跨天)、多段时长求和。全部按公历年月日整数运算,跨夏令时也不会多算少算一天。
怎么用
这一页把四件常被一起搜、其实规则各不相同的事分成了四个页签。每个页签填完就出结果,不用点确认;结果卡右下角有「复制」,可以直接贴进聊天框或表格。上次用的页签和填过的日期会记在你这台设备的浏览器里,下次打开还在。
一、两个日期相差多少天
填开始日期与结束日期,下面一次给齐四种口径:
- 相差 N 天——最常要的那个数;
- N 周零 N 天——排周计划、算孕周、算刑期与租期时好用;
- N 年 N 个月 N 天——按日历分解,不是拿天数除以 365 估出来的;
- 工作日 N 天 / 周末 N 天——两者相加正好等于总天数。
「含结束当天」这个开关决定算头算不算尾。默认不含:9 月 1 日到 9 月 8 日是 7 天,这是算「间隔」的口径;勾上之后是 8 天,这是算「一共占了几天」的口径——请假条、酒店住宿、租期、保修期通常按后者。两个数差 1,纠纷也常常就出在这 1 天上,所以页面把当前口径直接写在结果里。
把日期填反了不用重填:页面按绝对值算,并在下面提示一句「结束日期在开始日期之前」。
日期框下面有一排快捷按钮——今天、明天、一周后、100 天后、今年最后一天——点一下就填进结束日期,省得翻日历面板。
二、从某天往后/往前推
填基准日期、数量,选单位(天/周/个月/年)和方向(之后/之前),结果给出日期、星期几、以及「距今天多少天」。
月末怎么处理,本页写死一条规则:1 月 31 日加 1 个月=2 月的最后一天(平年 28 日、闰年 29 日)。目标月份没有那一天,就退到该月最后一天,并在结果下面标一句说明。同理,2024 年 2 月 29 日加 1 年是 2025 年 2 月 28 日,加 4 年才又是 2 月 29 日。
勾上「只算工作日」之后,单位自动锁成「天」,含义变为往后(前)数 N 个工作日:周六周日不计数,结果一定落在周一至周五。举例:星期四往后 1 个工作日是星期五,往后 2 个工作日直接跳到下星期一。这正是「三个工作日内回复」「五个工作日到账」的算法。注意它同样不含法定节假日与调休。
三、某天是什么日子
选一个日期,一次给出七项:星期几、当年第几天(并标出这一年共 365 还是 366 天)、当年还剩几天、ISO 第几周、是不是闰年、距今天多少天、这天出生的人今天多少周岁零多少天。
查历史日期是星期几、查某个纪念日今年落在星期几、查宝宝出生第几天、查合同签订那天是当年第几周,都用这一栏。
四、时间计算
这一栏承接「时间计算器」「时间差计算器」这类需求,三小块上下排:
- 两个时刻相差多久:两边各填时刻,需要跨天就把日期也填上(日期留空就按同一天算)。结果给「N 天 N 小时 N 分 N 秒」,外加总小时数、总分钟数、总秒数三个换算值——报工时、算加班、算时薪时直接取总小时数。
- 时刻加减一段时长:起点时刻加上或减去一段「时:分:秒」,自动跨天并标出「次日/前一日」。算夜班下班时间、算跨零点的航班落地时间用这一块。
- 多段时长相加:文本框里一行一段,写成
1:30或0:45:30,点「求和」得到合计,同时折算成小时与分钟。读不出来的行会被跳过并告诉你跳了几行,所以可以放心把带备注的行一起贴进去。
怎么看结果
「相差 7 天还是 8 天」,先看口径
同一对日期算出两个数不是谁算错了,而是问的问题不同:
- 不含结束当天(默认)=两点之间的间隔。9 月 1 日到 9 月 8 日是 7 天,正好一周。银行计息、账期、「N 天后到期」用这个。
- 含结束当天=这段日子一共占了几天。9 月 1 日到 9 月 8 日是 8 天。请假天数、住院天数、酒店住了几天、展会开了几天用这个。
判断方法很简单:问自己「开始那一天和结束那一天,是不是都要算成‘用掉的一天’」。都算,就勾上。
「N 年 N 个月 N 天」不是拿天数除出来的
这一行是按日历分解的,满足一个硬条件:把开始日期加上这么多年、再加这么多月、再加这么多天,正好等于结束日期。因为每个月天数不同,它和「天数 ÷ 365」估出来的结果经常对不上,而前者才是算年龄、算工龄、算合同期限时该用的那个。
也正因为月份长短不一,年月日分解会出现一些看着奇怪其实正确的结果。比如 2026 年 1 月 31 日到 3 月 1 日是「0 年 0 月 29 天」而不是「1 个月零 1 天」——因为 1 月 31 日加 1 个月只到 2 月 28 日,离 3 月 1 日还差 1 天,凑不满一个整月,只好整段按天算。
工作日那两个数怎么用
工作日 N 天只按星期数:落在周一到周五的算工作日,周六周日算周末,两者相加等于总天数。它不含法定节假日,也不含调休上班的周末。这不是偷懒:各国各地的假期表每年都在变,中国还有把周末调成工作日的做法,任何写死在网页里的假期表都会在某一年变成错的。
所以正确的用法是估量级:「离交稿还有 23 个工作日」意味着差不多还剩四周半的上班时间,够不够排得下手上的活,心里立刻有数。要精确到天,请对着当年的官方放假安排再核一遍——那份东西每年才发一次,人工核一遍并不费事,而被一个过期的假期表误导一次,代价可能很大。
推算结果为什么落在月末
看到结果下面出现「已经钳到该月最后一天」,说明发生了月末钳制:基准日是当月的第 29、30 或 31 天,而目标月份没有那么多天。这是日期库通行的处理方式,但它有两个反直觉的性质,用之前要知道:
- 不可逆:1 月 31 日 +1 个月 =2 月 28 日,2 月 28 日 −1 个月 =1 月 28 日,回不到 31 日;
- 不结合:1 月 31 日连加两次 1 个月是 3 月 28 日,一次加 2 个月是 3 月 31 日。
如果你的场景要求严格等距(比如按 30 天一期计息),请把单位改成天,别用月。
ISO 周和你的日历可能差一周
本页的「第几周」用的是 ISO 8601 规则:一周从星期一开始,第 1 周是含有当年第一个星期四的那一周。等价的说法是「包含 1 月 4 日的那一周」。副作用是 12 月底和 1 月初的几天会归到相邻年份:2021 年 1 月 1 日是星期五,属于 2020 年第 53 周,页面会写成「2020 年第 53 周」。
不少日历软件用的是另外两套:「1 月 1 日所在那一周算第 1 周」,或者「一周从星期日开始」。三套规则在一年里大部分时候一致,跨年那两周会差一周。做排产周、周报周、财务周口径时,先和对方确认用哪一套,再看这个数。
周岁那一行的口径
先用年份相减,今年生日还没到就减一岁,再数从最近一次生日到今天过了多少天,写成「N 周岁零 N 天」。这是中文语境里「几岁」的默认含义,与虚岁、与「周岁满多少个月」都不同。2 月 29 日出生的人在平年按 2 月最后一天过生日,和本页的月末钳制口径一致。
时间计算里的三个总数
第四个页签第一块给的「总小时数/总分钟数/总秒数」是同一段时长的三种写法,取哪个看下游怎么用:填工时表取总小时数(保留两位小数),算配速与时薪常用总分钟数,做日志与代码对时用总秒数。第三块的合计写成 时:分:秒 且小时不封顶——一周工时合计显示成 41:20:00 是正常的,不会自动折成「1 天 17 小时」,因为工时表要的就是小时数。
常见问题
日期计算器、天数计算器、日历计算器是一回事吗?
日常搜索里基本指同一件事:算两个日期之间有多少天,或者从某天推到另一天。「日历计算器」这个叫法容易和查日历混淆——查某年某月的日历长什么样、查农历和节气,那是日历/万年历要做的事;本页做的是算,不是查。所以这里没有月历面板,只有输入框和结果。
为什么不做农历和节假日?
两条理由。第一,数据要年年维护:农历需要逐年的历表,法定节假日与调休每年由各国各地区单独公布,一份写死的表在下一年就可能是错的。第二,错了不会报错:日期工具最危险的不是算不出来,而是安静地给出一个看着合理的错数,用户拿去排了计划、签了合同,等发现时已经晚了。与其做一个迟早过期的功能,不如把边界写清楚:本页只算公历,工作日只按周一到周五。
算天数时会不会因为时区或夏令时出错?
不会。页面把每个日期先换成一个整数——距 1970 年 1 月 1 日的天数——再做加减,全程不碰时分秒。常见的错误做法是拿两个时间戳相减再除以 86400000(一天的毫秒数),在实行夏令时的地区,切换那一天只有 23 小时或有 25 小时,除下来就会少一天或多一天;跨时区打开同一个页面还可能得到不同答案。本页从根上避开了这个坑。
支持多大的年份范围?公元前呢?
支持公元 1 年到 9999 年,超出范围会明确提示算不了。不支持公元前,也不处理儒略历到格里高利历的切换——1582 年以前的日期在本页按格里高利历的规则往回推算(术语叫「先发格里高利历」),和史书上按当时历法记载的日期可能对不上。做历史研究请用专门的历法换算工具。
时间那一栏为什么要单独填日期?
因为「从 22:30 到 6:00」有两种可能:同一天倒着走 16 小时半,或者跨过零点走 7 小时半。页面不替你猜:两边的日期都留空时按同一天算并在结果下注明;要跨天,就把日期填上,结果会给成「N 天 N 小时 N 分 N 秒」。第二块「时刻加减一段时长」则一定会跨天,并把「次日/前一日」标出来。
填过的日期存在哪里?换台电脑还在吗?
上次用的页签和填过的日期存在你当前这台设备的浏览器本地存储里(键名 hi8-riqi-prefs),只是为了下次打开省得重填。换设备、换浏览器或清理浏览数据之后就会回到默认值。计算过程全部在你的浏览器里完成。
和倒计时、秒表那几页怎么分工?
本页管日期:算过去与未来之间的间隔、推算某一天。想要盯着一个未来日期一秒一秒往下走,用在线倒计时那一页的「日期倒数」;想按设定时长倒数并到点响铃,也在那一页;要满屏大字投在教室或会议室,用大屏幕计时器;要记录一件事花了多久、跑圈计次,用秒表。简单记:算日子的差用这一页,数着时间走用那几页。
原理与冷知识
日期计算的正确姿势:先换成整数。几乎所有严肃的日期库内部都不直接对「年月日」做加减,而是先把它换成一个连续的天序号(天文学里叫儒略日,编程里常用「距 1970 年 1 月 1 日的天数」),加减完再换回来。原因是年月日不是一个均匀的进位系统:月有 28 到 31 天四种长度,年有 365 或 366 天两种,规则还随世纪年变化。换成整数之后,「相差多少天」就是一次减法,「往后推 N 天」就是一次加法,闰年与月长全被换算函数吸收掉了,不可能在半路算漏。本页用的是 Howard Hinnant 公开的那套整数算法,纯加减乘除、没有循环、没有查表,1 年到 9999 年一视同仁。
闰年规则里那个「一百年不闰、四百年又闰」。地球公转一圈约 365.2422 天,四年一闰平均成 365.25 天,每年多算了约 11 分 14 秒,128 年累积出一天。格里高利历用「整百年不闰、但 400 的倍数仍闰」把平均值压到 365.2425 天,误差降到每 3300 年差一天。所以 1900 年和 2100 年不是闰年,2000 年是——这个例外坑过无数程序:很多上世纪写的软件把闰年简化成「能被 4 整除」,在 2000 年侥幸蒙对了,真正的账要到 2100 年才结。
为什么 1582 年 10 月少了十天。格里高利历 1582 年颁行时,为了把累积的偏差一次补回来,规定 10 月 4 日的次日直接是 10 月 15 日——那一年的 10 月 5 日到 14 日在历史上不存在。更麻烦的是各国换历时间相差几百年:英国及其殖民地拖到 1752 年,俄国到 1918 年,所以同一历史事件在不同国家的记载里可能差十几天。这就是日期库通常只承诺「先发格里高利历」的原因:往前推算是一致的,但和当时当地的实际记载不保证对得上。
ISO 周是给工厂和财务用的。「第几周」这种说法在制造业、零售业和财务周报里极常见,因为它把一年切成整齐的七天块,便于同比。ISO 8601 把规则定成「周一开头、含当年第一个周四的那周是第 1 周」,好处是每一周完整地属于某一年,不会被切开;代价就是跨年那几天的归属反直觉,而且一年可能有 52 或 53 周。北美不少企业用的是另一套「周日开头、1 月 1 日所在周为第 1 周」,跨国对账时两边的「第 38 周」可能不是同一周,这是个每年都会重演的小事故。
「三个工作日内」为什么总比你想的久。「N 个工作日」算法的关键在于它跳过周末但从下一个工作日开始数:周五提交、三个工作日,落在下周三;如果再撞上假期,实际等待可能超过一周。本页第二个页签的「只算工作日」就是这个算法。顺带一提,很多机构口头说的「三个工作日」其实是「不超过三个工作日」,也有的从「受理日」而非「提交日」起算——同一句话可以差出两天来。
计算机的「零时刻」为什么是 1970 年 1 月 1 日。这个起点来自早期 Unix 系统:当时选了一个刚过去不久的整年开头当原点,方便用有限位数的整数表示时间。后来它成了事实标准,几乎所有编程语言的时间戳都以它为零点。副作用是 32 位有符号整数存的秒数会在 2038 年 1 月 19 日溢出,也就是所谓的「2038 年问题」;现代系统改用 64 位之后,可表示范围远远超过宇宙年龄。本页用的是「天数」而不是「秒数」,一天当一个单位,1 到 9999 年完全落在安全整数范围内。
为什么日期是软件里最容易出错的东西之一。时长不均匀、有闰年闰秒、有时区、有夏令时、有本地化格式、有历法差异,而且每一条都有例外:有的国家的夏令时切换发生在午夜,那一天某些本地时刻根本不存在;有的时区偏移不是整小时;月末、年末、闰日全是边界条件。这也是为什么本页把每一条口径都写在页面上——日期工具的价值不只在于算得对,更在于让人知道它算的到底是什么。