js 两个日期间隔月数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 两个日期间隔月数相关的知识,希望对你有一定的参考价值。

如何用Js获取两个YYYY-MM-DD格式的日期之间相差几个月?如2013-09-25和2014-01-15 应该是相差4个月,2013-09-20和2014-01-25 也是相差4个月

完整代码如下:

<html>
<head>
    <title>js 两个日期间隔月数</title>
    <script type="text/javascript">
        window.onload = function () 
            document.getElementById("btn_Diff").onclick = function () 
                var d1 = document.getElementById("txt_Date1").value;//日期1
                var d2 = document.getElementById("txt_Date2").value;//日期2
                //年*12+月
                var m1 = parseInt(d1.split("-")[1].replace(/^0+/, "")) + parseInt(d1.split("-")[0]) * 12;
                var m2 = parseInt(d2.split("-")[1].replace(/^0+/, "")) + parseInt(d2.split("-")[0]) * 12;
                alert(m2-m1);
            
        
       
    </script>
</head>
<body>
    <input id="txt_Date1" type="text" value="2013-09-25"/>
    <input id="txt_Date2" type="text" value="2014-01-15"/>
    <input id="btn_Diff" type="button" value="Diff"/>
</body>
</html>

效果如下:

参考技术A 相减,再做除法成吗 参考技术B 直接加多一个if判断DD咯

快速获取两个日期之间的总月数

【中文标题】快速获取两个日期之间的总月数【英文标题】:Get total include months between 2 date in swift 【发布时间】:2020-03-03 05:43:36 【问题描述】:

如何获得两个日期之间的总月数? 这是获取日期的正常方式

1) 开始日期:2020-2-22 10:25:00

2) 结束日期:2020-3-3 12:34:00

let diffInDate:Int = Calendar.current.dateComponents([.month], from: startDate, to: endDate).month!

如果我们按照上面给出的日期进行检查,它将返回 0,因为总共不超过 30 天。

现在,如果我们检查上述日期,我希望结果有一个月的差异,它应该返回 1,因为月份会发生变化。那么有没有办法检查日期差异,包括那个月份?

【问题讨论】:

你能不能只减去两个提供日期的月份值 - 除非我理解你的要求是错误的 @Kelsnare 我同意,但您还需要检查年份组件 @Kelsnare 感谢您的评论,实际上我想列出两个日期之间的飞蛾 @MitulBhadeshiya 我发布了一个响应您评论中的(替代)要求的答案。 【参考方案1】:

正如您正确识别的那样,dateComponents(_:from:to:) 不计算小数月份。

但是,有 another overload,它计算 DateComponents 之间的差异,而不是 Dates。我们可以从Dates 的开头和结尾去掉我们不需要的所有东西(天、小时、分钟等),将它们传递给这个重载,它应该为我们进行计算。这类似于在减去浮点数之前对其进行四舍五入,这样您就可以得到它们整数部分之间的差。

let startDateComponents = Calendar.current.dateComponents([.year, .month], from: startDate)
let endDateComponents = Calendar.current.dateComponents([.year, .month], from: endDate)
let diffInDate = Calendar.current.dateComponents([.month], from: startDateComponents, to: endDateComponents).month!

请注意,我们也得到了开始日期和结束日期的year 组件,因为计算中也需要年份。但是当我们计算差异时,我们只需要month

【讨论】:

很好的解决方案!但是,据我了解这个问题,应该计算从一个日期到另一个日期的月数。使用从 2020-08-30 到 2021-08-20 的代码,将计算 12 个月的数字。从 startDate 和 endDate 获取 dateComponents 时,只需包含 .day 即可获得 11 个月的结果。 @AndreiHerford 我认为我们对这个问题的理解不同。 OP 说“如果我们检查上述日期,它应该返回 1,因为月份会发生变化”,因此就 OP 而言,不应考虑天数。只要月份发生变化,就算作一个月。从 2020-08-30 到 2021-08-20,月份需要更改 12 次,所以在这个问题的上下文中,12 个月是正确的。从问题中给出的示例中也可以看出这一点。从“02-22 到 03-03”是一个月,虽然还不到 30 天。如果我们考虑天数,那么它将是 0 个月。【参考方案2】:

startDateendDate中获取month组件,然后计算它们之间的差,即

let startMonth = Calendar.current.component(.month, from: startDate)
let endMonth = Calendar.current.component(.month, from: endDate)
let difference = abs(endMonth - startMonth) //1

【讨论】:

如果年份会改变呢? 根据这个答案,2019-12-31 和 2020-01-01 之间的差异是 11 个月!【参考方案3】:

我要指出,应该编辑该问题以表明您希望知道如何列出月份,因为计算表示两个日期之间包含的月份数的整数可能是一项完全不同的任务。为此,清道夫的回答应该已经被认为是绰绰有余了。

我将尝试提供解决方案,以回应您澄清您想要月份列表的评论。

import UIKit

func makeDate(year: Int, month: Int, day: Int) -> Date 
    let calendar = Calendar(identifier: .gregorian)
    let components = DateComponents(year: year, month: month, day: day) //, hour: hr, minute: min, second: sec)
    return calendar.date(from: components)!


let date1 = makeDate(year: 2016, month: 10, day: 23) // 23 OCT 2016
let date2 = makeDate(year: 2020, month: 7, day: 10) // 10 JULY 2020

func printMonths(date1: Date, date2: Date) 

    guard date1 < date2 else return

    let month1 = Calendar.current.component(.month, from: date1)
    let month2 = Calendar.current.component(.month, from: date2)
    let year1 = Calendar.current.component(.year, from: date1)
    let year2 = Calendar.current.component(.year, from: date2)

    if year1 == year2 
        for month in month1...month2 
            print(DateFormatter().monthSymbols[month - 1])
        
     else 
        for year in year1...year2 
            print(year)
            switch year 
            case year1:
                for month in month1...12 
                    print("   \(DateFormatter().monthSymbols[month - 1])")
                
            case year2:
                for month in 1...month2 
                    print("   \(DateFormatter().monthSymbols[month - 1])")
                
            default:
                for month in 1...12 
                    print("   \(DateFormatter().monthSymbols[month - 1])")
                
            
            print()
        
    


printMonths(date1: date1, date2: date2)

此函数将按从 date1 到 date2 的顺序打印月份名称,如果两个日期的年份不同,则打印月份的年份。

如果您也需要,只需在每次打印月份名称时使用计数器即可轻松修改为打印总月数。

示例日期的输出:

2016
   October
   November
   December

2017
   January
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December

2018
   January
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December

2019
   January
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December

2020
   January
   February
   March
   April
   May
   June
   July

【讨论】:

以上是关于js 两个日期间隔月数的主要内容,如果未能解决你的问题,请参考以下文章

VB计算两个日期时间的间隔

怎样在EXCEL计算两个日期中间间隔几年几个月几天

JS 实现日期信息增加年数,月数,天数

怎么用excel计算两个日期之间的间隔年限?

如何用c语言来计算日期间隔天数?

如何用excel计算两个日期之间相差的年数和月数