从 1 月 31 号开始的一个月之后是哪天

2020-08-30 19:14:04 +08:00
 px920906

2 月 28(29)号还是 3 月 3(2)号?

google 了下好像是支持前者的比较多,但是这样的话,平年 1 月 28~31 四天开始的一个月之后都是 2 月 28 号,那如果一个人在后 3 天购买一个月有效期的产品不是亏了么,实际遇到这种情况会特殊处理吗?

dayjs 的逻辑也是前者

dayjs('2020/01/31').add(1,'month').toDate()
// Sat Feb 29 2020 00:00:00 GMT+0800 (中国标准时间)

如果用原生 js 的 setMonth 直接加一个月的话是后者

var d = new Date('2020/01/31')
d.setMonth(d.getMonth() + 1)
// 1583107200000
d
// Mon Mar 02 2020 08:00:00 GMT+0800 (中国标准时间)

以及各位看看中英文关键字分别得到的搜索结果,emmmm……

5918 次点击
所在节点    程序员
26 条回复
lmoon
2020-08-30 19:17:21 +08:00
一个月倾向于前者,31 天倾向于后者,你没发现现在有些会员不写一个月写 31 天吗?
realpg
2020-08-30 19:31:48 +08:00
收费性的业务需要,一般以付费方不吃亏,收费方多让点为主。
winterbells
2020-08-30 20:26:14 +08:00
会员基本都是 31 天吧
除了年付,有的写一个自然年
jousca
2020-08-30 20:32:33 +08:00
一般情况下考虑下个自然月终止。

比如遇到 2 月这种,1 月 31 日续费,有效期直接到 3 月 1 日结束,规避闰年和平年问题。 也顺便规避大小月份问题。比如 2 月 28 日续费 1 个月,有效期到 4 月 1 日。 6 月 30 日续费,有效期到 8 月 1 日。给付费方一点优惠。
wxsm
2020-08-30 20:34:48 +08:00
Date.setMonth:

> The current day of month will have an impact on the behaviour of this method. Conceptually it will add the number of days given by the current day of the month to the 1st day of the new month specified as the parameter, to return the new date. For example, if the current value is 31st August 2016, calling setMonth with a value of 1 will return 2nd March 2016. This is because in 2016 February had 29 days.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth

简单来说,dayjs 的逻辑才是正确的。setMonth 做了一些不该做的事情。别觉得奇怪,这就是 javascript,奇怪的不只这一处。
kaiki
2020-08-30 20:39:37 +08:00
腾讯的会员业务是按照 31 天算。
阿里云的服务器是按照日期算,大于则取最大日期,如 1 月 31 号购买一个月的服务器,到期是 2 月 28 或者 29 号,好像是这样的。
qinxi
2020-08-30 21:13:09 +08:00
看了微博视频的我表示. 可以是 3.4 3.6 5.1 6.4 10.1.12.9 等等等 都是.哈哈哈哈哈哈哈哈
littlewing
2020-08-30 21:15:40 +08:00
1 个月之后 是 2 月最后一天
30 或者 31 天之后,按实际天数算
Mutoo
2020-08-30 21:26:26 +08:00
取决于你的业务怎么定义:「下一个(自然)月」、「下一个月的今天」
可以配合 startOfMonth() / endOfMonth() 之类的函数使用。
zhizunzz
2020-08-30 21:33:03 +08:00
从明日零点开始计算, 今天剩余的几小时算是无尖不商的"尖", 一个月按 30 天算, 半年按 180 算, 一年就到明年今天
yidinghe
2020-08-30 22:17:15 +08:00
所以不要以月为单位嘛,就说 30 天就好了。
gaius
2020-08-31 00:40:38 +08:00
一般 addMonth(1)这种 api 都是 2 月最后一天,看业务了
anguiao
2020-08-31 00:44:40 +08:00
忘了是哪个服务了,我买的时候是 30 号,结果到了第二年 2 月,就变成 28 号到期了。虽然没多少钱,但是感觉还是很不爽的。
JustPisces
2020-08-31 00:58:00 +08:00
我个人倾向于按天数算的,一个月给 31 天,一年按 366 天计算
hanqian
2020-08-31 02:50:39 +08:00
说个不相关的,从楼主最后截图能看出 Google 中文搜索被污染的有多严重
mytharcher
2020-08-31 03:30:34 +08:00
这里面隐含了两个问题,一个是:什么叫“一个月之后”?是简单的 month + 1 ?还是以当前月份的天数为一个月为增量?甚至是以全年平均月份天数去整为增量?

第二个是:当前虽然标定在了一月的最后一天,但说的一个月之后是否代表了“下个月最后一天”?即是使用了倒数的方向。

这两个问题没有合理的定义的话,就没法给出答案了。
baobao1270
2020-08-31 05:06:32 +08:00
要么每个月 30 天算,很多云服务器都是这么算的,会计上也是这样算的
要么按“一个月的第几天”算并向下取整(即 1/5+1mo=2/5 ; 1/31+1mo=2/28 ),这个适合按月包的服务
要么一个一个月的算,1/31-1/31 一个周期,第二个周期是 2/1-2/28,第三个是 3/1-3/31,依次类推
lihongming
2020-08-31 05:12:07 +08:00
按月算,自然有大小月的问题,一般是指下个月的这一天,没有的话就到最后一天。

还有按自然月算的,更坑。比如 AWS 的某些服务,月底开始用也得收一个月的钱。
danhahaha
2020-08-31 08:16:42 +08:00
@hanqian 导致有些问题不得不用英文搜索,中文搜索有时候搜出几页内容牧场,不知道是 Google 懒于管理还是中文用的少
cco
2020-08-31 09:03:18 +08:00
目前就我订阅的东西来看,都是按照自然月算的。全年算下来也就差 1 天,懒得纠结。除非按天算的,一天的成本大于 10 块( vps 之类的除外)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702630

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX