您现在的位置是:首页 > 正文

JS获取两个日期间的月份和天数

2024-01-31 00:17:17阅读 0

方法1

//获取两个日期间的月份和天数,入参为日期格式参数
		function getMonthAndDay(startdate, enddate) {
            if (startdate.valueOf() > enddate.valueOf()) {
                var tmpdt = enddate;
                enddate = startdate;
                startdate = tmpdt;
            }
            var month = 0;
            var day = 0;
            enddate = getNextDay(enddate);
            if (enddate.getTime() >= startdate.getTime()) {
                month = (enddate.getFullYear() - startdate.getFullYear()) * 12 + enddate.getMonth() - startdate.getMonth();
                day = enddate.getDate() - startdate.getDate();
                if (day < 0) {
                    var lastmonthdaynum = getlastmonthDay(enddate);
                    day += lastmonthdaynum;
                    if (lastmonthdaynum < 30 && startdate.getDate() > 28) {
                        day += startdate.getDate() - lastmonthdaynum - 1;
                    }
                    month--;
                }
            } else {
                if (startdate.getTime() == getlastDay(startdate)) {
                    if (enddate.getTime() == getlastDay(enddate)) {
                        month = enddate.getFullYear() - startdate.getFullYear() * 12 + enddate.getMonth() - startdate.getMonth();
                        day = 0;
                    } else {
                        month = enddate.getFullYear() - startdate.getFullYear() * 12 + enddate.getMonth() - startdate.getMonth() - 1;
                        day = startdate.getDate();
                    }
                } else {
                    if (enddate.getTime() == getlastDay(enddate)) {
                        month = enddate.getFullYear() - startdate.getFullYear() * 12 + enddate.getMonth() - startdate.getMonth();
                        day = 0;
                    } else {
                        month = enddate.getFullYear() - startdate.getFullYear() * 12 + enddate.getMonth() - startdate.getMonth() - 1;
                        var lastmonthday = getlastmonthDay(enddate);
                        day = lastmonthday - startdate.getDate() + enddate.getDate();
                    }
                }
            }
            return { "month": month, "day": day };
        }
        //得到上一个月有多少天
        function getlastmonthDay(date) {
            date.setDate(1);
            date.setDate(date.getDate() - 1);
            return date.getDate();
        }
        //获取指定日期的后一天日期
        function getNextDay(d) {
            d = new Date(d);
            d = +d + 1000 * 60 * 60 * 24;
            d = new Date(d);
            var res = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
            return new Date(res);
        }
        //获取 date 所在的月有多少天
        function getlastDay(date) {
            date.setMonth(date.getMonth() + 1);
            date.setDate(1);
            date.setDate(date.getDate() - 1);
            return date.getDate();
        }

// 调用
var startDate = '2021-12-01'
var endDate = '2022-12-01'
var month_day = getMonthAndDay(new Date(startDate), new Date(endDate));
 
console.log(month_day);//输出结果

方法2

function getMonthsAndDaysBetween(date1, date2) {  
    var months = date2.getMonth() - date1.getMonth();  
    if (months < 0) {  
        months += 12;  
    }  
  
    var days = date2.getDate() - date1.getDate();  
  
    return {months: months, days: days};  
}  
  
var date1 = new Date("2023-01-01");  
var date2 = new Date("2023-06-10");  
  
console.log(getMonthsAndDaysBetween(date1, date2)); // 输出: { months: 5, days: 9 }
// 这个函数首先计算两个日期之间的月份差(这可能为负值,如果第二个日期在第一个日期之前),然后计算天数差。请注意,这个函数假设一个月的长度是固定的(30天),因此可能对于更复杂的情况(例如,考虑闰年和每个月的实际天数)并不准确。如果你需要更精确的解决方案,可能需要使用更复杂的日期计算库,如moment.js。

网站文章

  • Linux技巧

    0001 修改主机名(bjchenxu) vi /etc/sysconfig/network,修改HOSTNAME一行为&quot;HOSTNAME=主机名&quot;(没有这行?那就添加这一行吧),...

    2024-01-31 00:17:11
  • (故障集)——新安装的Ubuntu系统重启后ens33没了

    (故障集)——新安装的Ubuntu系统重启后ens33没了

    net-tools是一个工具包,其中包含构成Linux网络基础的一系列程序。从网上看到使用ifconfig -a可以显示lo和ens33网卡,然后使用。如果习惯使用旧的ifconfig命令,则需要安装。因为我的ubuntu版本是22.04版本,使用。...

    2024-01-31 00:17:06
  • Linux——搭建Samba服务器 最新发布

    为实现linux和windows文件共享,可以在linux安装Samba服务,可实现在windows上打开linux共享目录的功能。

    2024-01-31 00:16:36
  • 个人技能总结10:微信开发

    参考:http://www.cnblogs.com/fengzheng/p/5023678.html 一.开始前准备 1.公网服务器的准备 尽量不要使用ip那种的会影响后面好多功能。实际开发可自行购买云服务器和域名。域名不可以有端口号即只可用80端口。 附录1:使用ngrok做内网穿透 A)登录ngrok国内网址:https://www.ngrok.cc/注册账号,申请隧道。 B...

    2024-01-31 00:16:29
  • VueJs的组件化

    VueJs的组件化

    组件化: 目的:让页面的元素的使用性和复用性更高。 使用: 1.通过Vue.extend()声明组件 2.将组件注册到Vue容器里面 3.声明Vue管理边界 定义: 组件就是将一些html+css+js封装成了一个整体,通过整体之间嵌套实现页面构建 1.声明组件: Vue.extend({}) 实现对象里面的一些参数 达到组装组件过程 Vue.extend() Vue是个构造

    2024-01-31 00:16:21
  • 《Effective Java》阅读笔记 13使类和成员的可访问性最小化

    《Effective Java》阅读笔记 13使类和成员的可访问性最小化

    1.信息隐藏区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其内部数据和其他实现细节。设计良好的组件会隐藏所有的实现细节,把API与实现清晰地隔离开来。然后模块之间只...

    2024-01-31 00:15:51
  • C语言(CED)对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式(递归求解)

    C语言(CED)对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式(递归求解)

    又涉及到递归问题,这道题的大致内容是这样的: (请用递推方式求解)对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。下图是一个2行17列的走道的某种铺法。 提示:观察前n个结果,可以得到递推式子;如果N很大,需要高精度计算。 其实这道题,与之前的方格涂色问题很像,说它像不仅因为在思考方式上很像,在最后的代码上也很想像,听我一一道来。 题目提示,先观...

    2024-01-31 00:15:42
  • JAVA WEB:西蒙购物网 实现页面 资源及代码

    JAVA WEB:西蒙购物网 实现页面 资源及代码

    一、准备资源1、图片在web目录里创建images目录,存放项目所需图片文件:2、css样式文件在web里创建css目录,在里面创建main.css文件:/* 样式 */body { margin: 0px; text-align: center; background: url("../images/frontBack.jpg") no-repeat;...

    2024-01-31 00:15:33
  • Mysql  ----------  安装

    Mysql ---------- 安装

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。优点:关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。可以在官网下载地址: https://dev.mysql.com/downloads/安装:同意选择完整安装...

    2024-01-31 00:15:04
  • Django ORM:数据库操作的Python化艺术

    Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。

    2024-01-31 00:14:57