2013-05-16 82 views
1

我试图搜索答案,但找不到任何答案。 我试图创建一个JavaScript函数,它需要两个日期并返回格式为“x年,y个月,z天,一个小时,b分钟,c秒”的字符串。 通常的迭代划分失败,因为月份可能有不同的天数。我发现了几个消息来源,但是他们要么只能在几天/小时/分钟的时间内忽略月份问题,要么只是错误地平均每月的几天。JavaScript年,月,日,小时,分钟,秒差

function dateDifference(date) { 
    now = new Date(); 
    ??; 
    return difference; //returns something like "x years, y months, z days, a hours, b minutes, c seconds" 
} 

感谢您的帮助

+0

当你说“需要两个日期并返回一个字符串”你究竟返回什么?你在寻找两个日期之间的区别吗? – sbatson5

+0

是的,我基本上寻找两个日期(或日期和现在)之间的差异。我可以自己做最后的字符串格式。这是我遇到问题的那些数值。 – JonnyRobbie

+0

当我减去日期时,我不会以毫秒为单位获得差异吗?我neet能够将其转换为yy,mm,dd,hh,mm,ss,并且这些月份有问题。 – JonnyRobbie

回答

2

使用moment.js这是一个非常好的功能,您可以在纯文本的形式返回时间。

http://momentjs.com/

阅读API文档以及与功能一些聪明的黑客,你可以得到所需的输出字符串格式。顺便说一句,没有具体的图书馆,可以输出您所需格式的日期,我知道。所以,让我知道,如果你得到的地方,需要用moment.js

+0

我可以相对容易地格式化返回字符串。我只需要确切的数值。至于外部API,我害怕使用它,因为我可能会每页调用几十次(甚至一百次)函数,而且我担心会有相当大的放缓。 – JonnyRobbie

+0

像@ Salem的答案一样,您可以编写自己的关联对象,将当前月份映射到天数,然后您需要考虑闰年和内容等边缘情况。或者最简单的方法是只使用你想从moment.js获得的功能。我会试着看看我是否可以写一个演示。 – theshadowmonkey

0

你可以只减去两个日期以获得毫秒帮助,然后从那里工作:

var date1 = new Date("2012/06/12 12:00:30"); 
var date2 = new Date("2013/06/15 12:00:40"); 
var diff = Math.abs(date2 - date1); 
var years = Math.floor(diff/(1000*60*60*24*365)); // 1 
var months = Math.floor((diff - years)/(1000*60*60*24*30)) % 12; // 0 
(...) 
+0

您遇到的问题是不是每个月都有相同的天数。 – sbatson5

+0

但是我确切地描述了这个问题。这几个月并不都具有相同的天数。 – JonnyRobbie

+0

@MarekD但是如果一个月不是恒定的,你怎么能返回“x个月的差异”?例如,从28/2到29/3(同一年)有多少个月?从28/2到2/3? – Salem

2

使用.getTime转换的日期转换成毫秒:

var date1 = new Date(), 
    date2 = new Date(someDate), 
    diff = Math.abs(date1.getTime() - date2.getTime()); 

// then convert into years, months, etc 

编辑:您不能从平均月的长度,这个问题经常是暧昧闪避。例如,如果计算2月3日至3月10日的差额是1个月和7天(假设一个月是28天,如2月)或1个月和4天(假设一个月是31天,如3月)?

EDIT2:纠正了我真正令人震惊的数学。

EDIT3:其实,思考它,任何正常的人调换从正月天到最后一个月,并使用它来计算日子的差异。所以:

var date1 = new Date(), 
    date2 = new Date(1981, 10, 18); 
    switch = (date2.getTime() - date1.getTime()) < 0 ? false : true, // work out which is the later date 
    laterDate = switch ? date2 : date1; 
    earlierDate = switch ? date1 : date2; 
    dayDiff = laterDate.getDate() - earlierDate.getDate(), 
    monthDiff = laterDate.getMonth() - earlierDate.getMonth(), // javascript uses zero-indexed months (0-11 rather than the more conventional 1-12) 
    yearDiff = laterDate.getFullYear() - earlierDate.getFullYear(), 
    months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 

if (dayDiff < 0) { 
    monthDiff--; 
    dayDiff += months[laterDate.getMonth()-1]; // -1 because we want the previous month 
} 

if (monthDiff < 0) { 
    yearDiff--; 
    monthDiff += 12; 
} 

console.log(yearDiff+' years, '+monthDiff+' months, '+dayDiff+' days'); 

我想这会让我们大多数的方式存在,但我们还是要考虑闰年

编辑4:修正了几个(有时但不幸的是,并非总是抵消)关闭通过1个错误

+0

与其他答案一样的问题。这几个月并不都具有相同的天数。这是我的问题的核心,为什么我不能简单地使用分工,是吗? – JonnyRobbie

+0

+1我认为你的编辑真的回答了这个问题。 – Salem

+0

感谢RobJ为你的代码....我认为这是非常接近,没有它变得真正复杂的闰年。谢谢 – JonnyRobbie

相关问题