例如,在输入框中给定两个日期:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

如何在JavaScript中获得两个日期之间的天数?


当前回答

您可以使用UnderscoreJS来格式化和计算差异。

演示https://jsfiddle.net/sumitridhal/8sv94msp/

var startDate = moment(“206 -08- 29t23:35:01”); var endDate = moment(“206 -08- 30t23:35:01”); 游戏机。log (startDate); 游戏机。log (endDate); var结果= endDate。diff(startDate, hours, true); 文件。 文档全身appendChild(文档。createTextNode (resultHours)); 身体(白色空间:pre;font-family: monospace;) “https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js”< script src = > / < script >

其他回答

下面的解决方案将假设这些变量在代码中可用:

const startDate  = '2020-01-01';
const endDate    = '2020-03-15';

原生 JS

步骤:

设定开始日期 设定结束日期 计算的区别 将毫秒转换为天

const diffInMs   = new Date(endDate) - new Date(startDate)
const diffInDays = diffInMs / (1000 * 60 * 60 * 24);

备注:

我知道这不是你问题的一部分,但一般来说,我不建议在香草JavaScript中做任何日期计算或操作,而是使用date-fns, Luxon或moment.js这样的库,因为有许多边缘情况。

这个简单的JavaScript回答以十进制数计算天数。此外,在使用夏令时时,它可能会遇到边缘情况


使用图书馆

- 日期-fns

const differenceInDays = require('date-fns/differenceInDays');
const diffInDays = differenceInDays(new Date(endDate), new Date(startDate));

文档:https://date-fns.org/v2.16.1/docs/differenceInDays

——国际光子

const { DateTime } = require('luxon');
const diffInDays = DateTime.fromISO(endDate).diff(DateTime.fromISO(startDate), 'days').toObject().days;

文档:https://moment.github.io/luxon/docs/class/src/datetime.js DateTime.html # instance-method-diff

——Moment.js

const moment = require('moment');
const diffInDays = moment(endDate).diff(moment(startDate), 'days');

文档:https://momentjs.com/docs/ / /显示/不同


RunKit示例

使用以下公式可以计算出两个不同TZs的休止日期之间的完整证明天数差:

var start = new Date('10/3/2015'); var end = new Date('11/2/2015'); Var天数= (end - start) / 1000 / 60 / 60 / 24; console.log(天); //实际上是30;但由于夏令时,将显示31.0xxx //你需要抵消如下 days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24); console.log(天);

一行代码和小代码

const diff=(e,t)=>Math.floor((new Date(e).getTime()-new Date(t).getTime())/1000*60*60*24);

// or

const diff=(e,t)=>Math.floor((new Date(e)-new Date(t))/864e5);

// or

const diff=(a,b)=>(new Date(a)-new Date(b))/864e5|0; 

// use
diff('1/1/2001', '1/1/2000')

为打印稿

const diff = (from: string, to: string) => Math.floor((new Date(from).getTime() - new Date(to).getTime()) / 86400000);

如果我们想计算我们的年龄,这是一个有点不同的答案

    {
      birthday: 'April 22, 1993',
      names: {
        first: 'Keith',
        last: 'Buckley'
      }
    },
    {
      birthday: 'January 3, 1975',
      names: {
        first: 'Larry',
        last: 'Heep'
      }
    },
    {
      birthday: 'February 12, 1944',
      names: {
        first: 'Linda',
        last: 'Bermeer'
      }
    }
  ];
const cleanPeople = people.map(function ({birthday, names:{first, last}}) {
      // birthday, age, fullName;
      const now = new Date();
      var age =  Math.floor(( Date.parse(now) - Date.parse(birthday)) / 31536000000);
      return {
        age,
        fullName:`${first} ${last}`
      }
    });
    console.log(cleanPeople);
    console.table(cleanPeople);

我最近也有同样的问题,因为我来自Java世界,所以我立即开始搜索JavaScript的JSR 310实现。JSR 310是Java的日期和时间API (Java 8的标准版本)。我认为这个API设计得很好。

幸运的是,有一个直接的Javascript端口,称为js-joda。

首先,在<head>中包含js-joda:

<script
    src="https://cdnjs.cloudflare.com/ajax/libs/js-joda/1.11.0/js-joda.min.js"
    integrity="sha512-piLlO+P2f15QHjUv0DEXBd4HvkL03Orhi30Ur5n1E4Gk2LE4BxiBAP/AD+dxhxpW66DiMY2wZqQWHAuS53RFDg=="
    crossorigin="anonymous"></script>

然后简单地这样做:

let date1 = JSJoda.LocalDate.of(2020, 12, 1);
let date2 = JSJoda.LocalDate.of(2021, 1, 1);
let daysBetween = JSJoda.ChronoUnit.DAYS.between(date1, date2);

现在daysBetween包含了间隔的天数。注意,结束日期是独占的。