Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

小技巧:已知年月,求该月共多少天? #41

Open
tanxchen opened this issue Jan 21, 2019 · 6 comments
Open

小技巧:已知年月,求该月共多少天? #41

tanxchen opened this issue Jan 21, 2019 · 6 comments

Comments

@tanxchen
Copy link

tanxchen commented Jan 21, 2019

在写日历组件时,曾遇到 已知年月,求该月共多少天? 这样的需求。

最开始思路会是:

  • 先判断该年份是否是闰年,来处理 2 月份情况,闰年 2 月共 29 天,非闰年 2 月共 28 天
  • 再判断其他月份,如 1 月共 31 天,4 月共 30 天

代码就不一一列出了,思路代码啥的没啥问题。

这里其实有种更简便的方法,借助 Date API 处理日期溢出时,会自动往后推延响应时间的规则,直接上代码:

// month 值需对应实际月份减一,如实际 2 月,month 为 1,实际 3 月,month 为 2
function getMonthCountDay (year, month) {
  return 32 - new Date(year, month, 32).getDate()
}

验证下:

// 求闰年的 2 月份总天数
getMonthCountDay(2000, 1) // 29
// 求 1 月份总天数
getMonthCountDay(2000, 0) // 31
getMonthCountDay(2001, 0) // 31
// 求 4 月份总天数
getMonthCountDay(2000, 3) // 30
getMonthCountDay(2001, 3) // 30
@wind-stone
Copy link

类似的方式:

function getMonthCountDay (year, month) {
  return new Date(year, month + 1, 0).getDate()
}

@ZhangDaZongWei
Copy link

问题:Date API 处理日期溢出时,会自动往后推延响应时间的规则,那么具体的规则内容是什么?谢谢!

@troy351
Copy link

troy351 commented Mar 6, 2019

@ZhangDaZongWei 就是类似于加法进位,减法退位。

  • new Date(2019, 0, 50)其中0代表1月,1月只有31天,则多出来的19天会被加到2月,结果是2019年2月19日。
  • new Date(2019, 20, 10),1年只有12个月,多出来的9个月会被加到2020年,结果是2020年9月10日
  • new Date(2019, -2, 10),2019年1月10日往前推2个月,结果为2018年11月10日
  • new Date(2019, 2, -2),2019年3月1日往前推2天,结果为2019年2月26日
  • 以上可以混用

@ZhangDaZongWei
Copy link

@troy351 thank you, very much!

@ystarlongzi
Copy link

下月的第 0 天,就是上个月的最后一天

@xgqfrms
Copy link

xgqfrms commented May 31, 2019

👻 learning...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants